没有很多python /编程经验。 我需要测试1到10亿之间的每个数字,然后将某些数字附加到列表中。目前我正在尝试使用range(0,Billion),但我发现使用Python 3.3在我的机器上大约需要大约80秒。有没有更有效的方法来做到这一点?
for i in range(0, Billion)
# if i passes test
i.append(samplelist)
答案 0 :(得分:3)
没有。 考虑一下机器时间方面的代码。您的测试和附加功能无法触及,因此我们剩下的就是我的范围。这是你的基本循环,就像你可以得到的那样。您可以编写一个while循环并编写另一行来自行增加,但我怀疑这会增加您的执行时间,因为您要对python解释器进行更多调用,然后必须对其进行处理。
第二个想法,如果你能优化你的测试程序......
答案 1 :(得分:2)
通常,如果你需要迭代到1000000000,那么还有更好的方法。例如,您可以使用某些数学属性来避免测试每个数字:
samplelist = [x**2 for x in range(int(1000000000**0.5))] # get all perfect squares up to 1000000000
Python对于数值运算来说并不是那么快。因此,迭代到1000000000并在每次迭代中做一些事情会变得很慢;除了尝试更快的解释器(例如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)
答案 2 :(得分:0)
这应该快一点,但大部分时间可能花在调用some_test()
samplelist = [i for i in range(1000000000) if some_test(i)]