我正在寻找一种更有效的方法来总结给定字符串中所有字符的ASCII值,仅使用标准python(最好是2.7)。
目前我有:
print sum(ord(ch) for ch in text)
我想强调一下,这个问题的主要焦点和方面就是我上面写的内容。
以下是这个问题的一个不那么重要的方面,应该这样对待:
那我为什么要问呢?!我已经将这种方法与嵌入一个简单的C代码函数进行了比较,该函数使用PyInline执行相同的here,并且看起来简单的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
答案 0 :(得分:20)
您可以使用中间bytearray
加快速度:
>>> sum(bytearray("abcdefgh"))
804
这不比生成器快17倍 - 它涉及创建中间bytearray
并且sum
仍然需要迭代Python整数对象 - 但是在我的机器上它确实加速了求和从2μs到大约700ns的8字符串。如果这个球场的时间对于你的用例来说效率仍然太低,你应该用C编写应用程序的速度关键部分。
如果您的字符串足够大,并且您可以使用numpy
,则可以通过使用numpy.frombuffer
直接引用字符串的缓冲区来避免创建临时副本:
>>> import numpy as np
>>> np.frombuffer("abcdefgh", "uint8").sum()
804
对于较小的字符串,由于numpy视图创建机制的复杂性,这比临时数组要慢。但是,对于足够大的字符串,frombuffer
方法开始得到回报,它当然总是产生更少的垃圾。在我的机器上,截止点是大约200个字符的字符串大小。
另外,请参阅Guido的经典论文Python Optimization Anecdote。虽然它的一些特定技术现在可能已经过时,但关于如何认为关于Python优化的一般教训仍然非常重要。
您可以使用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
答案 1 :(得分:7)
通过删除生成器的创建,你可以加速一点(~40%ish,但远不及本机C的速度快......)
而不是:
sum(ord(c) for c in string)
执行:
sum(map(ord, string))
时序:
>>> timeit.timeit(stmt="sum(map(ord, 'abcdefgh'))")
# TP: 1.5709713941578798
# JC: 1.425781011581421
>>> timeit.timeit(stmt="sum(ord(c) for c in 'abcdefgh')")
# TP: 1.7807035140629637
# JC: 1.9981679916381836
答案 2 :(得分:1)
print sum(map(ord,my_string))
这将是最简单的。
答案 3 :(得分:0)
打印字符串中字符的ASCII值之和
首先将所有字符串转换成列表,每个单词都分开。然后使用ord()函数将每个字符转换为ascii并将其存储在列表中,然后添加所有列表值。
str1 = input("Please Enter your Own String : ")
li=[]
li[:0]=str1
print(li)
result=[]
for i in range(len(li)):
result.append(ord(li[i]))
result = list(set(result))
print(result)
final=sum(result)
print("The sum of the your string '{}'is: {}".format(str1,final))