2013-03-06 72 views
1

没有很多python /编程经验。 我需要测试1到10亿之间的每个数字,然后将某些数字附加到列表中。目前我正在尝试使用范围(0,Billion),但是我发现在我的机器上使用Python 3.3需要大约80秒的时间。有没有更高效的方法来做到这一点?用Python计算最多10亿的最快方法

for i in range(0, Billion) 
    # if i passes test 
    i.append(samplelist) 
+4

我希望你的意思'samplelist.append(我)'。 – nneonneo 2013-03-06 03:14:05

+0

'我需要测试1到10亿之间的每个数字,然后在列表中附加一些数字。',我想你最好检查一下你的算法,而不是微观优化。 – Abhijit 2013-03-06 03:16:19

+0

您可能想要考虑将计算与[多处理](http://docs.python.org/3.3/library/multiprocessing.html)并行化。 – unutbu 2013-03-06 03:51:26

回答

0

这应该是快一点,但大部分的时间大概花了调用some_test()

samplelist = [i for i in range(1000000000) if some_test(i)] 
+0

仍然没有范围那么快。用我原来的方法计算到只有一百万美元花费了大约0.07秒......这花费了大约0.11秒,即时猜测有十亿时间会加起来 – francium 2013-03-06 03:31:51

2

通常,如果你需要遍历了1000000000,有一些更好的办法。例如,你可以使用一些数学性质,以避免测试每一个数字:

samplelist = [x**2 for x in range(int(1000000000**0.5))] # get all perfect squares up to 1000000000 

Python的不是真的那么快的数值运算。因此,迭代到10亿次,并且在每次迭代中做一些事情都会变得缓慢;还有的没有办法解决这个除了尝试更快的解释器(如PyPy),或在像C.


更高性能的语言编写的代码或者,如果要添加元素的数量庞大的列表,那么请考虑使用生成器来代替。这将避免创建一个庞大的列表的开销,同时还对很多东西是有用的:

def gen_numbers(n): 
    for i in range(n): 
     if <i passes test>: 
      yield i 

for i in gen_numbers(1000000000): 
    print(i) 
3

号 想想你的机器时间方面具有的代码。你的测试和附加功能不能被触及,所以我们所有的东西都是在范围内。这是你最基本的循环,就像你可以得到的那样。您可以编写一个while循环并编写另一行来自己增加i,但是我怀疑这实际上会增加执行时间,因为您正在对python解释器进行更多调用,然后必须对其进行处理。

退一步讲,如果你可以优化您的测试程序...

+0

那么列表理解肯定比反复调用附加更有效 – 2013-03-06 03:15:39

+2

@gnibbler:不是太多。尝试分解列表理解。 – nneonneo 2013-03-06 03:16:08

+0

增加一个计数器至少会给你Python 2.7的内存优势,但Python 3.3中的'range()'似乎更类似于2.7的'xrange()',这意味着并不是所有的十亿值都一次存储在内存中。 – acattle 2013-03-06 03:35:54