我对这个函数感到困惑combSciPy 的 http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.misc.comb.html看起来比简单的 Python 实现要慢。这是两个等效程序解决以下问题的测量时间欧拉计划第 53 题 https://projecteuler.net/problem=53.
使用 SciPy:
%%timeit
from scipy.misc import comb
result = 0
for n in range(1, 101):
for k in range(1, n + 1):
if comb(n, k) > 1000000:
result += 1
result
Output:
1 loops, best of 3: 483 ms per loop
没有 SciPy:
%%timeit
from math import factorial
def comb(n, k):
return factorial(n) / factorial(k) / factorial(n - k)
result = 0
for n in range(1, 101):
for k in range(1, n + 1):
if comb(n, k) > 1000000:
result += 1
result
Output:
10 loops, best of 3: 86.9 ms per loop
第二个版本大约快 5 倍(在两台 Mac 上测试,python-2.7.9-1、IPython 2.3.1-py27_0)。这是预期的行为吗?comb
SciPy 的函数 (源代码 https://github.com/scipy/scipy/blob/v0.14.0/scipy/special/basic.py#L1144)?我究竟做错了什么?
编辑(来自 Anaconda 3.7.3-py27_0 发行版的 SciPy):
import scipy; print scipy.version.version
0.12.0
编辑(IPython 之外的差异相同):
$ time python with_scipy.py
real 0m0.700s
user 0m0.610s
sys 0m0.069s
$ time python without_scipy.py
real 0m0.134s
user 0m0.099s
sys 0m0.015s