如何解决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
为节省时间,我非常感谢一些性能提示/此算法的另一种方法。预先感谢!
解决方法
您可以使用profiling软件来解决性能问题,但使用逻辑(利用Python封装的更快的语言)可能会为您服务。就像使用numpy之类的科学图书馆,使用某些FFI (foreign function interface)或创建并调用自定义程序一样。
更具体地说,Python在计算方面本来就非常慢,因为每个操作都会带来很多负担(例如臭名昭著的GIL)。将这项工作传递给另一种语言可以使您较少地支付此开销成本,而不是在每个循环中的每个可能点上支付!
科学图书馆至少可以为您做到这一点
- 行为类似于Python逻辑(这对您很友好!),同时每个动作执行许多已知步骤(而不是一次执行)
- 也许能够对操作进行向量化(performing many actions in the same processor step利用处理时间的更多优势)
函数的基本分析:时间复杂度:3 O(n)空间复杂度:3 O(n)。因为您的循环3次;我的建议是循环一次,使用生成器,这将花费1/3的时间和空间。
我升级了代码,并使用生成器删除了一些无用的变量:
def binLsb(data):
databin = ""
num_of_bits = 8
for i in range(len(data)):
newdatabin = bin(int(data[i],16))[2:].zfill(num_of_bits)[::-1]
while len(str(databin)) > 14:
yield (int(str(databin[:14])[::-1],2))
databin = databin[14:]
databin += str(newdatabin)
享受
橄榄
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。