Я использую python, и, очевидно, самая медленная часть моей программы - простые добавления к переменным с плавающей точкой.
Для выполнения 400 000 000 сложений / умножений требуется около 35 секунд.
Я пытаюсь выяснить, какой самый быстрый способ я могу сделать эту математику.
Вот так выглядит структура моего кода.
Пример (фиктивный) код:
def func(x, y, z):
loop_count = 30
a = [0,1,2,3,4,5,6,7,8,9,10,11,12,...35 elements]
b = [0,11,22,33,44,55,66,77,88,99,1010,1111,1212,...35 elements]
p = [0,0,0,0,0,0,0,0,0,0,0,0,0,...35 elements]
for i in range(loop_count - 1):
c = p[i-1]
d = a[i] + c * a[i+1]
e = min(2, a[i]) + c * b[i]
f = e * x
g = y + d * c
.... and so on
p[i] = d + e + f + s + g5 + f4 + h7 * t5 + y8
return sum(p)
func()
вызывается около 200к раз. loop_count
составляет около 30. И у меня ~ 20 умножений и ~ 45 сложений и ~ 10 использований min / max
Мне было интересно, есть ли метод для меня, чтобы объявить все это как ctypes.c_float и сделать добавление в C, используя stdlib или что-то подобное?
Обратите внимание , что p[i]
, вычисленный в конце цикла, используется как c
в следующей итерации цикла. Для итерации 0 он просто использует p [-1], который в данном случае равен 0.
Мои ограничения:
- Мне нужно использовать Python. Хотя я понимаю, что простая математика будет быстрее в C / Java / и т.д. Я не могу использовать его из-за множества других вещей, которые я делаю в Python, что нельзя сделать в C в этой же программе.
- Я пытался написать это с помощью Cython, но это вызвало кучу проблем со средой, в которой мне нужно было выполнить это. Итак, опять же - не вариант.