我将他们的基准测试代码包装在一个函数中:
- import random
- def benchmark_qsort():
- lst = [ random.random() for i in range(1,5000) ]
- qsort_kernel(lst, 0, len(lst)-1)
对它计时会获得:
- 100 loops, best of 3:18.3 ms per loop
对 benchmark_qsort_numpy_cython() 函数计时会获得:
上述代码与 C 代码异常类似。Cython 应当能很好地处理它。除了应用 Cython 和静态类型之外,让我们应用 Numpy
数组代替列表。在数组大年夜小较大年夜时,比如数千个或更多元素,Numpy 数组确切比Python 列表更快。
安装 Numpy 可能会花一些时光,推荐应用 Anaconda 或一个已安装了 Python 科学对象组合的 Docker 镜像。
在应用 Cython 时,须要将 Numpy 导入到应用了 Cython 的单位中。在应用 C 类型时,还必须应用 cimport 将它作为 C 模块导入。Numpy数组应用一种表示数组元素类型和数组维数(一维、二维等)的特别语法来声明。
- %%cython
- import numpy as np
- cimport numpy as np
- cpdef np.ndarray[double, ndim=1] \
- qsort_kernel_cython_numpy_type(np.ndarray[double, ndim=1] a, \
- long lo, \
- long hi):
- cdef:
- long i, j
- double pivot
- i = lo
- j = hi
- while i < hi:
- pivot = a[(lo+hi) // 2]
- while i <= j:
- while a[i] < pivot:
- i += 1
- while a[j] > pivot:
- j -= 1
- if i <= j:
- a[i], a[j] = a[j], a[i]
- i += 1
- j -= 1
推荐阅读
Aporeto是一家“云原生”的安然始创公司,旨在确保那些不受信的IT情况的安然性。该公司方才在A轮融资——也就是岁尾产品宣布之前——获得了>>>详细阅读
地址:http://www.17bianji.com/lsqh/35343.html
1/2 1