python - Python算法提速/性能提示
问题描述
我正在处理大文件(超过 2Gb)并且我有很多处理函数来处理数据。我的问题是完成处理需要很多(很多)时间。从所有功能来看,似乎需要更长的时间是这个:
def BinLsb(data):
Len = len(data)
databin = [0] * (int(Len))
num_of_bits = 8
###convert to bin the octets and LSB first
for i in range(Len):
newdatabin = bin(int(data[i], 16))[2:].zfill(num_of_bits)[::-1]
databin[i] = newdatabin
###group the 14bit and LSB again
databin = ''.join(databin)
composite_list = [databin[x:x + 14] for x in range(0, len(databin), 14)]
LenComp = len(composite_list)
for i in range(LenComp):
composite_list[i] = (int(str(composite_list[i])[::-1], 2))
return composite_list
我真的很感激一些性能提示/该算法的另一种方法,以节省我一些时间。提前致谢!
解决方案
您可以通过分析软件来寻找性能问题,但使用利用 Python 包装的更快语言的逻辑可能会为您提供很好的服务。这可能看起来像使用像numpy这样的科学库,使用一些FFI(外部函数接口),或者创建和调用自定义程序。
更具体地说,Python 在计算方面本身就非常慢,因为每个操作都带有很多包袱(例如臭名昭著的GIL)。将这项工作转移到另一种语言可以让您更少地支付这种间接成本,而不是在每个循环中的每个可能点!
科学图书馆至少可以为您做到这一点
- 表现得像 Python 逻辑(这对你很友好!),同时每个动作执行许多已知步骤(而不是一次一个)
- 可能能够矢量化操作(通过在同一处理器步骤中执行许多操作来更多地利用处理时间)
推荐阅读
- r - 在折线图 R 中显示值
- android - Room 无法验证数据完整性,即使在卸载应用程序然后重新安装后也是如此
- c++ - C++ 上的并行并不像 C# 那样快
- verilog - 左移直到 MSB 为 1:超出循环计数限制。条件永远不会是假的
- powershell - 记录从单个父 ps 脚本调用的多个子 ps 脚本的输出的最佳简单方法是什么?
- c - 如何删除C中的特定记录
- r - 如何按一列分组并获取其他列的方法
- javascript - js类返回未定义的对象
- html - CSS区分悬停在元素上和它的 ::before 伪元素
- javascript - 在制作 Leaflet 地图时,如何将 GeoJSON 坐标拉取并转换为 latLng?