Читая интересную книгу "От Python to Numpy", я встретил пример, описание которого выглядит следующим образом:
Рассмотрим простой пример, где мы хотим очистить все значения из массива с dtype
np.float32
. Как написать его для максимальной скорости?
Представленные результаты удивили меня, и когда я перепроверил их, у меня появилось совершенно другое поведение. Итак, я попросил автора дважды проверить, но он получил те же результаты, что и раньше (OS X 10) в таблице ниже:
Варианты были рассчитаны на три разных компьютера: mine (Win10, Win7) и автор (OSX 10.13.3). С Python 3.6.4 и numpy 1.14.2, где каждый вариант был рассчитан на фиксированные 100 циклов, лучше всего 3.
Изменение: этот вопрос не касается того факта, что на разных компьютерах с разными характеристиками я получаю разные времена - это очевидно :) Вопрос в том, что поведение в разных операционных системах сильно отличается - что не так очевидно? (если это, конечно, так, я был бы рад, если бы кто-то мог дважды проверить).
Настройка была: Z = np.ones(4*1000000, np.float32)
| Variant | Windows 10 | Ubuntu 17.10 | Windows 7 | OSX 10.13.3 |
| | computer 1 | comp 2 | comp 3 |
| --------------------------- | ------------------------- | --------- | ----------- |
| Z.view(np.float64)[...] = 0 | 758 usec | 1.03 msec | 2.72 msec | 1.01 msec |
| Z.view(np.float32)[...] = 0 | 757 usec | 1.01 msec | 2.61 msec | 1.58 msec |
| Z.view(np.float16)[...] = 0 | 760 usec | 1.01 msec | 2.62 msec | 2.85 msec |
| Z.view(np.complex)[...] = 0 | 1.06 msec | 1.02 msec | 3.26 msec | 918 usec |
| Z.view(np.int64)[...] = 0 | 758 usec | 1.03 msec | 2.69 msec | 1 msec |
| Z.view(np.int32)[...] = 0 | 757 usec | 1.01 msec | 2.62 msec | 1.46 msec |
| Z.view(np.int16)[...] = 0 | 760 usec | 1.01 msec | 2.63 msec | 2.87 msec |
| Z.view(np.int8)[...] = 0 | 758 usec | 773 usec | 2.68 msec | 614 usec |
| Z.fill(0) | 747 usec | 998 usec | 2.55 msec | N/A |
| Z[...] = 0 | 750 usec | 1 msec | 2.59 msec | N/A |
Как видно из этой таблицы, в Windows результаты не зависят от просматриваемого типа, но в OS X этот хак сильно влияет на производительность. Можете ли вы дать понять, почему это происходит?
Изменить: Как я уже писал выше, три компьютера разные.
Спецификации первого компьютера: Windows 10 и Ubuntu 17.10
Процессор: Intel Xenon E5-1650v4 3,60 ГГц
Оперативная память: 128 ГБ DDR4-2400
Спецификации второго компьютера: Windows 7
Процессор: Intel Pentium P6100 2,00 ГГц
Оперативная память: 4 ГБ DDR3-1333
Спецификации третьего компьютера: у меня нет этой информации :)
Редактировать 2: Добавить результаты для первого компьютера на Ubuntu 17.10.