gpt4 book ai didi

字符串中所有字符的ASCII值的Python总和

转载 作者:太空狗 更新时间:2023-10-29 17:54:32 25 4
gpt4 key购买 nike

我正在寻找一种更有效的方法来总结 ASCII给定字符串中所有字符的值,仅使用标准 python(最好是 2.7)。

目前我有:

print sum(ord(ch) for ch in text)

我想强调的是,我在这个问题上的主要关注点和方面是我上面写的。

以下是这个问题不太重要的方面,应该这样对待:

那我为什么要问呢?!我比较了这种方法与嵌入一个简单的 C 代码函数,后者具有相同的功能 here使用 PyInline,一个简单的 C 嵌入式函数似乎快了 17 倍。

如果没有比我建议的更快的 Python 方法(仅使用标准 Python),Python 开发人员没有在核心中添加这样的实现似乎很奇怪。

建议答案的当前结果。在我的 Windows 7、i-7、Python 2.7 上:

 text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
sum(ord(ch) for ch in text)
>> 0.00521324663262
sum(array.array("B", text))
>> 0.0010040770317
sum(map(ord, text ))
>> 0.00427160369234
sum(bytearray(text))
>> 0.000864669402933

C-code embedded:
>> 0.000272828426841

最佳答案

您可以使用中间的 bytearray 来加快速度:

>>> sum(bytearray("abcdefgh"))
804

这并不比生成器快 17 倍——它涉及创建一个中间 bytearraysum 仍然需要遍历 Python 整数对象——但在我的机器上它确实加快了从 2μs 到大约 700ns 的 8 字符字符串的求和。如果这个大概的时间对于您的用例来说仍然太低效,您可能应该用 C 语言编写应用程序的速度关键部分。

如果您的字符串足够大,并且可以使用 numpy,则可以通过使用 numpy.frombuffer 直接引用字符串的缓冲区来避免创建临时副本:

>>> import numpy as np
>>> np.frombuffer("abcdefgh", "uint8").sum()
804

对于较小的字符串,这比临时数组慢,因为 numpy 的 View 创建机制很复杂。然而,对于足够大的字符串,frombuffer 方法开始得到返回,而且它当然总是产生更少的垃圾。在我的机器上,截止点是大约 200 个字符的字符串大小。

另见Guido的经典随笔Python Optimization Anecdote .虽然它的一些具体技术现在可能已经过时,但关于如何思考 Python 优化的一般类(class)仍然非常相关。


您可以使用 timeit 模块为不同的方法计时:

$ python -m timeit -s 's = "a" * 20' 'sum(ord(ch) for ch in s)' 
100000 loops, best of 3: 3.85 usec per loop
$ python -m timeit -s 's = "a" * 20' 'sum(bytearray(s))'
1000000 loops, best of 3: 1.05 usec per loop
$ python -m timeit -s 'from numpy import frombuffer; s = "a" * 20' \
'frombuffer(s, "uint8").sum()'
100000 loops, best of 3: 4.8 usec per loop

关于字符串中所有字符的ASCII值的Python总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12492137/

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