Почему struct.pack обладает такой высокой изменчивостью в производительности?

При тестировании производительности struct.pack я получаю следующий результат:

In [3]: %timeit pack('dddd', 1.0, 1.0, 1.0, 1.0)
The slowest run took 578.59 times longer than the fastest. This could
mean that an intermediate result is being cached 
1000000 loops, best of 3: 197 ns per loop

Почему самый медленный прогон в 578 раз медленнее? Пакет делает некоторое внутреннее кэширование, или это результат какого-то кэширования на уровне процессора или что-то еще?

Ответ 1

Профилировщик IPython находится на месте. Результат действительно кэшируется (по крайней мере, в некоторых версиях python). Например, в python 2.7.6 вы можете найти соответствующий код здесь, где определена функция cache_struct.

Эта функция просматривает кеш, чтобы увидеть, был ли недавно применен данный формат и возвращает соответствующий экземпляр Struct вместо создания нового (что кажется относительно дорогостоящим).

Вы можете видеть, что он используется в функции pack (и другие).


Этот контент был размещен в комментариях, но заслуживает ответа.