我们要用于python计算性能的提高,我们用这个方式可以提升至少5倍的性能
Python 代码(使用列表推导式生成素数):
python def primes_python(n): primes = [2] for i in range(3, n + 1, 2): if all(i % p != 0 for p in primes): primes.append(i) return primes print(primes_python(50))
优化这个代码,我们需要创建一个 .pyx
文件,然后在这个文件中编写 Cython 代码。接下来,我们需要编译这个 .pyx
文件,生成一个 C 语言的扩展模块,最后在 Python 代码中导入这个模块。首先,创建一个名为 primes_cython.pyx
的文件,然后在这个文件中编写以下 Cython 代码:
cimport cython @cython.boundscheck(False) @cython.wraparound(False) def primes_cython(int n): cdef int i, p cdef list primes = [2] for i in range(3, n + 1, 2): for p in primes: if i % p == 0: break else: primes.append(i) return primes
接下来,创建一个名为 setup.py
的文件,编写以下内容:
python from setuptools import setup from Cython.Build import cythonize setup( ext_modules=cythonize("primes_cython.pyx"), )
现在,打开终端,进入到包含 primes_cython.pyx
和 setup.py
的文件夹,然后运行以下命令来编译 Cython 代码:
bash python setup.py build_ext --inplace
编译成功后,你会在文件夹中看到一个名为 primes_cython.*.so
或 primes_cython.*.pyd
的文件(具体取决于你的操作系统)。这个文件就是我们的 C 语言扩展模块。最后,在 Python 代码中导入这个模块,并调用 primes_cython
函数:
python from primes_cython import primes_cython print(primes_cython(50))
这样,我们就使用 C方式 优化了原始的 Python 代码。这个 版本的代码在执行效率上会比纯 Python 代码快很多,特别是在处理大量数据或者进行复杂数学计算时
在使用时我们只需和源文件放在一个地方,python会优先从,so或pyd中来导入执行