Python 算法加速/性能提示
Python algorithm speed up / Perfomance tips
我正在处理大文件(超过 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 the software, but you'll probably be well-served by using logic which takes advantage of a faster language wrapped by Python. This could look like using a scientific library like numpy, using some FFI (foreign function interface) 或创建和调用自定义程序来查找性能问题。
更具体地说,Python 在计算方面天生 非常慢 ,因为每个操作都带有很多包袱(例如臭名昭著的 GIL).将这项工作交给另一种语言可以让您减少支付这种间接费用的频率,而不是在每个循环的每个可能点都支付!
科学图书馆至少可以在
之前为您完成这项工作
- 表现得像 Python 逻辑(这对你很友好!)同时每个动作执行许多已知步骤(而不是一次一个)
- 可能能够矢量化操作(通过 performing many actions in the same processor step 充分利用处理时间)
你的函数基本分析:时间复杂度:3O(n) space复杂度:3O(n)。因为你循环了 3 次;我的建议是循环一次,使用生成器,这将花费 1/3 的时间和 space.
我升级了你的代码并使用生成器删除了一些无用的变量:
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)
享受
奥利弗
我正在处理大文件(超过 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 the software, but you'll probably be well-served by using logic which takes advantage of a faster language wrapped by Python. This could look like using a scientific library like numpy, using some FFI (foreign function interface) 或创建和调用自定义程序来查找性能问题。
更具体地说,Python 在计算方面天生 非常慢 ,因为每个操作都带有很多包袱(例如臭名昭著的 GIL).将这项工作交给另一种语言可以让您减少支付这种间接费用的频率,而不是在每个循环的每个可能点都支付!
科学图书馆至少可以在
之前为您完成这项工作- 表现得像 Python 逻辑(这对你很友好!)同时每个动作执行许多已知步骤(而不是一次一个)
- 可能能够矢量化操作(通过 performing many actions in the same processor step 充分利用处理时间)
你的函数基本分析:时间复杂度:3O(n) space复杂度:3O(n)。因为你循环了 3 次;我的建议是循环一次,使用生成器,这将花费 1/3 的时间和 space.
我升级了你的代码并使用生成器删除了一些无用的变量:
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)
享受
奥利弗