python - 在python中添加/相乘两个浮点标量数的最快方法
问题描述
我正在使用 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()
被调用了大约 200k 次。loop_count
大约是 30。我有 ~20 次乘法和 ~45 次加法和 ~10 次使用 min/ max
我想知道是否有一种方法可以让我将所有这些声明为 ctypes.c_float 并使用 stdlib 或类似的东西在 C 中进行添加?
请注意,p[i]
在循环结束时计算的值用于c
下一次循环迭代。对于迭代 0,它只使用 p[-1],在这种情况下为 0。
我的限制:
- 我需要使用python。虽然我理解普通数学在 C/Java/等中会更快。我无法使用它,因为我在 python 中做的许多其他事情不能在同一个程序中的 C 中完成。
- 我尝试用 cython 编写它,但它导致了我需要在其中运行它的环境出现了一堆问题。所以,再次 - 不是一个选项。
解决方案
我认为你应该考虑使用 numpy. 你没有提到任何约束。
一个简单的点操作的例子(xy)
import datetime
import numpy as np
x = range(0,10000000,1)
y = range(0,20000000,2)
for i in range(0, len(x)):
x[i] = x[i] * 0.00001
y[i] = y[i] * 0.00001
now = datetime.datetime.now()
z = 0
for i in range(0, len(x)):
z = z+x[i]*y[i]
print "handmade dot=", datetime.datetime.now()-now
print z
x = np.arange(0.0, 10000000.0*0.00001, 0.00001)
y = np.arange(0.0, 10000000.0*0.00002, 0.00002)
now = datetime.datetime.now()
z = np.dot(x,y)
print 'numpy dot =',datetime.datetime.now()-now
print z
输出
handmade dot= 0:00:02.559000
66666656666.7
numpy dot = 0:00:00.019000
66666656666.7
numpy 的速度要快 100 倍以上。
原因是 numpy 封装了一个 C 库,该库对编译后的代码进行点操作。在完整的 python 中,你有一个潜在的通用对象列表,铸造,......
推荐阅读
- python - 如何将数据框转换为 csv 并保存以返回它?
- json - 使用 Codable 解码这种 JSON
- javascript - React-Select v2 逗号分隔搜索
- c++ - C ++'getline'没有重载函数的实例与参数列表匹配
- nginx - 将 nginx 安装到 centos7 VPS 但 DNS 中断
- python - 使用 Asyncio 执行 HTTP 请求
- ruby-on-rails - has_one 关联未将方法添加到 belongs_to 类
- numpy - 从 CSV 值构造批处理 Numpy 数组的最佳方法?
- java - 具有平方距离的 2D 随机游走程序
- java - 如何在springboot中构建微服务GET api,它可以将单个或多个参数作为插入请求url并作为请求获取数据