在2个数字之间进行变换的最有效方法

时间:2018-11-21 16:44:04

标签: python-3.x

现在我正在使用简单的for循环

p1 += ([(x,i) for i in range(j,y+1)])

仅以我的代码为例,例如,我正在创建元组范围

j = 1,y = 9998,x = 1

所以我应该得到(1,1),(1,2)......(1,9998)这是一个元组列表。

如果数量很大,循环将花费很多时间。

有一种无需使用库即可进行改进的方法。

2 个答案:

答案 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