摘要:在优化 Python 代码时,性能关键部分可以从 Cython 等工具中受益匪浅。在本文中,我们将演练将 Python 实现的性能与 Cython 实现的性能进行比较的过程。最后,您将了解 Cython 如何加速计算以及如何精确测量执行时间。
在优化 Python 代码时,性能关键部分可以从 Cython 等工具中受益匪浅。在本文中,我们将演练将 Python 实现的性能与 Cython 实现的性能进行比较的过程。最后,您将了解 Cython 如何加速计算以及如何精确测量执行时间。
我们从一个简单的 Python 函数开始,该函数计算范围内数字的平方和:
import timedef python_function: result = 0 for i in range(1, 10**6): result += i**2 return resultif __name__ == "__main__": start_time = time.perf_counter python_result = python_function end_time = time.perf_counter print(f"Python Result: {python_result}") print(f"Python Execution Time: {end_time - start_time:.10f} seconds")Python 实现功能正常,但相对较慢,在此范围内执行大约需要 0.0987 秒。
Cython 允许将类似 Python 的语法编译成 C 语言,从而大大提高性能。我们创建了以下 Cython 实现并将其保存在名为 cython_function.pyx 的文件中:
def cython_function: cdef unsigned long long result = 0 # Use unsigned long long for larger values cdef unsigned long long i # Use unsigned long long for the loop variable for i in range(1, 10**6): # Ensure the loop runs correctly result += i * i # Avoid Python's ** operator; use * for better performance and accuracy return result此实现使用 cdef 将变量声明为 unsigned long long,从而防止整数溢出并确保计算保持高效。
为了编译 Cython 文件,我们使用了以下 setup.py 脚本:
from setuptools import setup, Extensionfrom Cython.Build import cythonizeextensions = [ Extension("cython_function", ["cython_function.pyx"]),]setup( ext_modules=cythonize(extensions),)我们运行了编译命令:
python setup.py build_ext --inplace这会在工作目录中生成一个 .pyd 文件 ( cython_function.cp312-win_amd64.pyd )。
我们更新了 Python 脚本以测试这两种实现,并使用 time.perf_counter 精确测量执行时间:
from cython_function import cython_functionfrom Python_Implementation import python_functionimport time# Measure Python execution timestart_time = time.perf_counterpython_result = python_functionend_time = time.perf_counterprint(f"Python Result: {python_result}")print(f"Python Execution Time: {end_time - start_time:.10f} seconds")# Measure Cython execution timestart_time = time.perf_countercython_result = cython_functionend_time = time.perf_counterprint(f"Cython Result: {cython_result}")print(f"Cython Execution Time: {end_time - start_time:.10f} seconds")结果表明,Cython 的性能得到了显著提高:
Cython 优化:
声明变量类型 (cdef) 和使用高效运算(例如,* 而不是 **)对于性能至关重要。精确计时:
time.perf_counter 提供更高的分辨率,非常适合测量小执行时间。设置挑战:
编译 Cython 需要 C 编译器。对于 Windows,安装 Microsoft C++ Build Tools 是必不可少的。通过使用 Cython 将类似 Python 的代码编译成 C 语言,我们实现了性能的显著提升。这证明了 Cython 在 Python 中优化计算密集型任务的潜力。Cython 密切关注变量类型和编译步骤,对于希望将 Python 的简单性与 C 语言的速度相融合的开发人员来说,它是一个强大的工具。
来源:自由坦荡的湖泊AI一点号