gpt4 book ai didi

python - bytearray 和替代品的性能

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:33 27 4
gpt4 key购买 nike

我正在为基于 TCP 的协议(protocol)编写解析器。

一些消息被分成多个数据包,所以我需要能够“窥视”我的流,并有可能返回并在末尾附加传入数据。另一方面,我希望能够丢弃我已成功解析的数据包的内容。

  • bytes 的问题是追加需要复制(在 CPython 中不是这样,但是也不可能删除不可变对象(immutable对象)中的第一个字节)。
  • bytearray 的问题是刷新已经看到的字节也需要复制(或者我认为,见下文)
  • collections.deque 的问题是需要大量内存。与 list 相同。

但是,我用 bytearray 做了一些测试,似乎 pop(0) 操作比列表更有效:

from time import time

n = 100000

for container in [bytearray, list]:
print(container)

a = container(b'a'*n)
t = time()
for i in range(n):
del a[0]
print('del a[0]', time() - t)

a = container(b'a'*n)
t = time()
for i in range(n):
del a[-1]
print('del a[-1]', time() - t)

a = container(b'a'*n)
t = time()
for i in range(n-1):
del a[1]
print('del a[1]', time() - t)

a = container(b'a'*n)
t = time()
for i in range(n-1):
del a[-2]
print('del a[-2]', time() - t)

print()

似乎 del a[0]del a[-1] 对于 bytearray 具有大致相同的复杂性,在 cpython2 中, cpython3 和 pypy3。

我想知道:

  1. 这怎么可能?有没有比 del a[:k] 更有效的方法来删除前 k 个字节?

  2. 有没有比bytearray更高效的数据结构? (可能使用 arraymemoryviewctypes)

最佳答案

Python 故意牺牲代码性能来换取程序员的性能。

使用最方便的方式。

您有一个正确工作的实现时并且性能被证明是不够的,将仅关键位替换为(如分析所示)更快的等价物。参见 https://wiki.python.org/moin/PythonSpeed/PerformanceTips#Overview:_Optimize_what_needs_optimizing了解更多信息。


也就是说,您描述的用例的主要候选对象是“分块缓冲区”,它会从一系列缓冲区中透明地返回切片。

从中提取数据仍然需要复制(因为所有标准 Python 类型都拥有自己的内存),如果您在纯 Python 中实现该类型,您将有解释器开销。因此,要获得任何重大改进,您可能必须使用 Cython/C 或其他东西。这就是为什么首先正确进行总体设计如此重要的原因——在纯 Python 中,更改内容要容易得多。

关于python - bytearray 和替代品的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49722955/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com