Я получаю очень странные тайминги для следующего кода:
import numpy as np
s = 0
for i in range(10000000):
s += np.float64(1) # replace with np.float32 and built-in float
Почему 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 раза быстрее. Почему? Могу ли я что-нибудь сделать, чтобы это исправить?
Я хочу подчеркнуть, что мои тайминги не связаны ни с одним из следующих факторов:
Я обновил свой код, чтобы было понятнее, в чем проблема. С новым кодом, 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
.
Моя машина:
РЕДАКТИРОВАТЬ №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)
Время:
Теперь оба np
float (64 или 32) в 5 раз медленнее, чем встроенный float
. Все-таки существенная разница. Я пытаюсь понять, откуда он.
КОНЕЦ РЕДАКТИРОВАНИЯ