Я получаю действительно странные тайминги для следующего кода:
import numpy as np
s = 0
for i in range(10000000):
s += np.float64(1) # replace with np.float32 and built-in float
- встроенный поплавок: 4.9 с
- float64: 10.5 с
- float32: 45.0 с
Почему float64
в два раза медленнее, чем float
? И почему float32
в 5 раз медленнее, чем float64?
Есть ли способ избежать штрафа за использование np.float64
, а функции numpy
возвращают встроенный float
вместо float64
?
Я обнаружил, что использование numpy.float64
намного медленнее, чем плавающий Python, а numpy.float32
еще медленнее (хотя я на 32-битной машине).
numpy.float32
на моей 32-разрядной машине. Поэтому каждый раз, когда я использую различные функции numpy, такие как numpy.random.uniform
, я преобразовываю результат в float32
(так что дальнейшие операции будут выполняться с 32-битной точностью).
Можно ли установить одну переменную где-нибудь в программе или в командной строке и сделать все numpy-функции возвратом float32
вместо float64
?
РЕД. # 1:
numpy.float64 10 раз медленнее, чем float в арифметических вычислениях. Это так плохо, что даже конвертирование в float и обратно до вычислений заставляет программу работать в 3 раза быстрее. Зачем? Есть ли что-нибудь, что я могу сделать, чтобы исправить это?
Я хочу подчеркнуть, что мои тайминги не связаны ни с одним из следующих:
- функция вызывает
- преобразование между numpy и float python
- создание объектов
Я обновил свой код, чтобы сделать его более ясным, где проблема. С новым кодом, похоже, я вижу десятикратное увеличение производительности при использовании типов данных numpy:
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: 34.56s
- float32: 35.11s
- float: 3.53s
Просто, черт возьми, я также пробовал:
из datetime import datetime import numpy как 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 с; это фактически в 3 раза быстрее, чтобы преобразовать float64
в float
и обратно, чем использовать его как есть. Тем не менее, преобразование имеет свои потери, поэтому в целом он более чем в 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.8GHz).
Опять же, код:
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
. Тем не менее, значительная разница. Я пытаюсь понять, откуда оно взялось.
КОНЕЦ РЕДАКТИРОВАНИЯ