【问题标题】:Python algorithm speed up / Perfomance tipsPython算法加速/性能提示
【发布时间】:2021-01-14 19:26:22
【问题描述】:

我正在处理大文件(超过 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

非常感谢一些性能提示/该算法的另一种方法,以便为我节省一些时间。提前致谢!

【问题讨论】:

  • 最好有一个完整的可运行示例。这还包括正确形状和 dtype 的(随机)输入数据。 Cython 或 Numba 可以在这里提供帮助,但需要完全重写函数。

标签: python list performance binary cpu-speed


【解决方案1】:

您可以通过profiling 软件查找性能问题,但使用利用 Python 封装的更快语言的逻辑可能会为您提供很好的服务。这可能看起来像使用像 numpy 这样的科学库,使用一些 FFI (foreign function interface),或者创建和调用自定义程序。

更具体地说,Python 在计算方面本身非常慢,因为每个操作都带有很多包袱(例如臭名昭​​著的GIL)。将这项工作转移到另一种语言可以让您更少地支付这种间接成本,而不是在每个循环中的每个可能点!

科学图书馆至少可以为您做到这一点

【讨论】:

    【解决方案2】:

    您的函数的基本分析:时间复杂度:3O(n) 空间复杂度:3O(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)
    

    享受

    奥利弗

    【讨论】:

    • 问题是因为我需要在第一个循环之后重新组合位,所以我真的看不出如何减少循环...
    • “将花费 1/3 的时间和空间”——实际上,虽然生成器节省了内存,但它们并不能提供更高的速度——请参阅 Generator speed in python 3
    • @Izalion 我升级了一些代码,希望这些代码能给你更多的提示
    • @DarrylG 这是书中的典型想法。
    • @Han.Oliver--1) 时序测试表明生成器并不快(但内存效率更高)。实际上,它们过去比列表推导式要慢,但 Python 3 中的速度改进使它们具有可比性,即From List Comprehensions to Generator Expressions。 2) 在升级代码中,这一行:databin += str(newdatabin) 是有问题的,因为它长期以来被证明是连接列表的最慢方法,即Efficient String Concatenation in Python
    猜你喜欢
    • 2021-12-14
    • 1970-01-01
    • 2012-03-11
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    相关资源
    最近更新 更多