现在我正在使用简单的for循环
p1 += ([(x,i) for i in range(j,y+1)])
仅以我的代码为例,例如,我正在创建元组范围
j = 1,y = 9998,x = 1
所以我应该得到(1,1),(1,2)......(1,9998)
这是一个元组列表。
如果数量很大,循环将花费很多时间。
有一种无需使用库即可进行改进的方法。
答案 0 :(得分:2)
zip()
函数将两个迭代器组合为一系列元组。 itertools.repeat()
创建一个始终生成相同对象的迭代器。
import itertools
zip(itertools.repeat(x), range(j, y+1))
这将返回一个惰性迭代器,您可以将其循环一次(例如for a, b in zip(...): ...
)。如果您希望将所有元组收集到一个列表中,并且可以不按顺序访问它们,请对list()
的结果调用zip(...)
。
答案 1 :(得分:2)
您可以使用zip(iter1, iter2, ...)
函数创建一个迭代器,该迭代器将生成一个元组,该元组由参数中传递的可迭代元素组成。
使用itertools.cycle()
在元组中提供常量元素。
如果使用zip()
返回的迭代器(即不使其成为list()
),则可以节省时间,但只能使用一次。如果迭代器已用尽,则需要创建一个新的迭代器,但这太快了。
在Python 3.7.1上,这种方式快了30% 这是自己测试的代码:
import timeit
from itertools import cycle
x = 5
j = 1
y = 10000
def method1():
return [(x, i) for i in range(j, y + 1)]
cycling_x = cycle([x])
def method2():
return list(zip(cycling_x, range(j, y + 1)))
print(timeit.timeit("method1()", number=10000, globals=globals()))
print(timeit.timeit("method2()", number=10000, globals=globals()))
>>> 10.956179626
>>> 7.571100585999998