这个python基准有用吗?

时间:2012-07-22 21:57:55

标签: python

我最近尝试在python中运行Project Euler问题。我相信它会做100 ^ 5步骤。

在看到我的解决方案需要花费太长时间(它应该在一分钟内运行)后,我问自己任何运行这么多步骤的 python程序是否可行(在一分钟之内)

所以,我设计了一个愚蠢的小测试

def fun():
  l=range(1,100)
  for x in l:
     for y in l:
        for k in l:
           for n in l:
               for h in l:
                  s=1

>>> t = timeit.Timer('demorado.fun()','import demorado')
>>> t.timeit(1)
1202.484529018402
>>>

有意义吗?是否证明任何具有这么多步骤的程序(在这种情况下,我猜有2 *(100 ^ 5))总是需要20分钟?

5 个答案:

答案 0 :(得分:2)

项目Euler问题不应该在一分钟内运行,因为你的编程语言足够,但因为存在一个更聪明的解决方案而不仅仅是暴力。

但是在你的情况下,是的,你会得到一个循环99^5次的函数(不是100^5,因为range(1,100)1, 2, ..., 99)...

答案 1 :(得分:2)

这是一个合理的假设,虽然我不确定它是否正在做你想要的。在现实生活中,这可能更接近:

for i in xrange(100 ** 5): pass

答案 2 :(得分:1)

对于python,它可能是一个很好的估计。使用numpy或C ++扩展可能会加速Project Euler代码,但请记住Project Euler上的所有问题都可以在<1分钟内解决。您不太可能需要运行100 ^ 5个操作才能获得正确的解决方案。如果我是你,我会尝试从不同的角度解决问题。

答案 3 :(得分:1)

  

是否证明任何具有这么多步骤的程序总是需要20分钟?

取决于您对“步骤”的定义。这里的代码需要大约99 ^ 5个浮点运算,但运行时间约为1秒:

import numpy as np
a = np.zeros(shape=(1681, 1681), dtype=np.float32) # 1681 x 1681 matrix
b = np.dot(a, a) # matrix product

答案 4 :(得分:0)

在内循环中尝试pass而不是s=1

另外,将numpy.nditer与“external_loop”选项一起使用,或者如果循环结果是您的瓶颈,则在Cython中编写循环。