Я просматривал следующий код и думал, что заметил потенциальную проблему с производительностью.
def multiply(x):
return x * 10
def test():
data = tuple(x for x in range(5))
first_map = tuple(map(
multiply,
tuple(x for x in data)
))
second_map = tuple(map(
multiply,
tuple(x for x in data)
))
ziped = tuple(zip(data, second_map, first_map))
return ziped
import timeit
print(timeit.timeit('test()', globals=globals()))
Запуск этой печати 5.317162958992412
для меня.
Я думал, что все эти промежуточные tuple
вызовет многократные итерации по данным, и поэтому я превратил это в следующее.
def multiply(x):
return x * 10
def test():
data = tuple(x for x in range(5))
first_map = map(
multiply,
(x for x in data)
)
second_map = map(
multiply,
(x for x in data)
)
ziped = tuple(zip(data, second_map, first_map))
return ziped
import timeit
print(timeit.timeit('test()', globals=globals()))
И на самом деле, запустив эту распечатку 4.783027238998329
для меня, мы оптимизировали производительность.Ууу!
Но теперь наступает удивительная (для меня) часть! .По мере масштабирования данных результаты переворачиваются!
Другими словами, если мы изменим data
на data = tuple(x for x in range(50))
, то версия с промежуточными кортежами станет более быстрой.
Чего мне не хватает?