【发布时间】:2014-12-17 17:27:31
【问题描述】:
comb of SciPy 函数似乎比简单的 Python 实现要慢,这让我感到困惑。这是解决Problem 53 of Project Euler 的两个等效程序的测量时间。
使用 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
输出:
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
输出:
10 loops, best of 3: 86.9 ms per loop
第二个版本大约快 5 倍(在两台 Mac 上测试,python-2.7.9-1,IPython 2.3.1-py27_0)。这是 SciPy (source code) 的 comb 函数的预期行为吗?我做错了什么?
编辑(来自 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
【问题讨论】:
-
我在 ipython 控制台(命令行)中尝试了这个,两个版本都得到了相似的结果(每个循环大约 90 毫秒)。
-
谢谢。我添加了我的 SciPy 版本,即 0.12.0。这也是你的吗?
-
我使用的是 0.14.0 - 但我会创建一个简单的脚本并从命令行对其计时:
time python simple-script.py
标签: python scipy combinations benchmarking