numpy float: в 10 раз медленнее, чем встроенные арифметические операции?

Я получаю очень странные тайминги для следующего кода:

import numpy as np
s = 0
for i in range(10000000):
    s += np.float64(1) # replace with np.float32 and built-in float
  • встроенный float: 4,9 с
  • float64: 10,5 с
  • float32: 45,0 с

Почему float64 вдвое медленнее, чем float ? И почему float32 в 5 раз медленнее, чем float64?

Есть ли способ избежать штрафа за использование np.float64 и вернуть функции numpy встроенный float вместо float64 ?

Я обнаружил, что использование numpy.float64 намного медленнее, чем float Python, и numpy.float32 работает еще медленнее (хотя я использую 32-битную машину).

numpy.float32 на моей 32-битной машине. Поэтому каждый раз, когда я использую различные функции numpy, такие как numpy.random.uniform , Я конвертирую результат в float32 (чтобы дальнейшие операции выполнялись с 32-битной точностью).

Есть ли способ установить одну переменную где-нибудь в программе или в командной строке, и заставить все функции numpy возвращать float32 вместо float64 ?

РЕДАКТИРОВАТЬ №1:

numpy.float64 в 10 раз медленнее, чем float в арифметических вычислениях . Это так плохо, что даже преобразование в float и обратно до вычислений заставляет программу работать в 3 раза быстрее. Почему? Могу ли я что-нибудь сделать, чтобы это исправить?

Я хочу подчеркнуть, что мои тайминги не связаны ни с одним из следующих факторов:

  • функция вызывает
  • преобразование между numpy и python float
  • создание of objects

Я обновил свой код, чтобы было понятнее, в чем проблема. С новым кодом, import numpy as np

START_TIME = datetime.now()

s = np.float64(1)
for i in range(10000000):
    s = float(s)
    s = (s + 8) * s % 2399232
    s = np.float64(s)

print(s)
print('Runtime:', datetime.now() - START_TIME)

Время выполнения 13,28 с; фактически преобразовать float64 в float и обратно в 3 раза быстрее, чем использовать его как есть. Тем не менее, преобразование берет свое, поэтому в целом оно более чем в 3 раза медленнее по сравнению с чистым питоном float .

Моя машина:

  • Intel Core 2 Duo T9300 (2,5 ГГц)
  • WinXP Professional (32-разрядная версия)
  • ActiveState Python 3.1.3.5
  • Numpy 1.5.1

РЕДАКТИРОВАТЬ №2:

Спасибо за ответы, они помогают мне понять, как решить эту проблему. .

Но я все же хотел бы знать точную причину (возможно, основываясь на исходном коде), почему приведенный ниже код работает в 10 раз медленнее с float64 , чем с float .

] РЕДАКТИРОВАТЬ № 3:

Я перезапускаю код под Windows 7 x64 (Intel Core i7 930 @ 3,8 ГГц).

И снова код:

from datetime import datetime
import numpy as np

START_TIME = datetime.now()

# one of the following lines is uncommented before execution
#s = np.float64(1)
#s = np.float32(1)
#s = 1.0

for i in range(10000000):
    s = (s + 8) * s % 2399232

print(s)
print('Runtime:', datetime.now() - START_TIME)

Время:

  • float64: 16,1s
  • float32: 16.1s
  • float: 3.2s

Теперь оба np float (64 или 32) в 5 раз медленнее, чем встроенный float . Все-таки существенная разница. Я пытаюсь понять, откуда он.

КОНЕЦ РЕДАКТИРОВАНИЯ

47
задан Jonas Schäfer 21 March 2017 в 15:27
поделиться