【发布时间】:2013-04-23 18:01:53
【问题描述】:
我不知道为什么会发生这种情况。我弄乱了一些列表,我需要一个从 0 到 log(n, 2) 的 for 循环,其中 n 是列表的长度。但是代码非常慢,所以经过一番研究,我发现问题出在范围生成上。演示示例代码:
n = len([1,2,3,4,5,6,7,8])
k = 8
timeit('range(log(n, 2))', number=2, repeat=3) # Test 1
timeit('range(log(k, 2))', number=2, repeat=3) # Test 2
输出
2 loops, best of 3: 2.2 s per loop
2 loops, best of 3: 3.46 µs per loop
测试的数量很少(我不希望它运行超过 10 分钟),但它已经表明 range(log(n, 2)) 比仅使用整数对数的对应物慢几个数量级。这真的很令人惊讶,我不知道为什么会发生这种情况。可能是我的 PC 上的问题,可能是 Sage 问题或 Python 错误(我没有在 Python 上尝试过同样的问题)。
使用xrange 代替range 也无济于事。另外,如果你得到带有.n() 的号码,测试 1 会以与 2 相同的速度运行。
有人知道会发生什么吗? 谢谢!
【问题讨论】:
-
听起来像是 Sage(也许是 cython?)的问题。 Python
range甚至不接受浮点数。 -
而且 Python 在全局命名空间中也没有
log(如果不将setup添加到timeit就无法到达那里)。并且n也不适用于timeit。timeit上没有repeat参数(我假设您使用from timeit import timeit获得)。 -
您的输出不是显示您的
timeit返回的值是相当随机的吗?毕竟你尝试了两次同样的事情(n和k都是 8),得到的结果差别很大。 -
你真的预先计算了
n吗? -
“另外,如果你得到带有
.n()的号码”。等等,什么?从哪里获取what号? AFAIK,Sage 建立在 ipython 之上,其所有“神奇”语法都以%或!开头。
标签: python performance sage