Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python字符串中所有字符的ASCII值之和_Python_String_Python 2.7_Ascii - Fatal编程技术网

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

Python字符串中所有字符的ASCII值之和,python,string,python-2.7,ascii,Python,String,Python 2.7,Ascii,我正在寻找一种更有效的方法来汇总给定字符串中所有字符的值,只使用标准python(最好使用2.7) 目前我有: print sum(ord(ch) for ch in text) 我想强调,这个问题的主要焦点和方面是我上面写的。 以下是这个问题的不太重要的方面,应该这样对待: 那我为什么要问?!我将这种方法与嵌入一个简单的C代码函数进行了比较,后者使用PyInline实现了同样的功能,而一个简单的C嵌入函数似乎要快17倍 如果没有比我建议的更快的Python方法(只使用标准Python),那么

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

目前我有:

print sum(ord(ch) for ch in text)
我想强调,这个问题的主要焦点和方面是我上面写的。

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

那我为什么要问?!我将这种方法与嵌入一个简单的C代码函数进行了比较,后者使用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倍,它需要创建一个中间的
bytearray
sum
仍然需要迭代Python整数对象,但在我的机器上,它确实可以将8个字符字符串的求和速度从2μs提高到700ns左右。如果在这种情况下,计时对于您的用例来说仍然效率太低,那么您可能应该用C编写应用程序的速度关键部分

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

>>> import numpy as np
>>> np.frombuffer("abcdefgh", "uint8").sum()
804
对于较小的字符串,这比临时数组慢,因为numpy的视图创建机制非常复杂。然而,对于足够大的字符串,
frombuffer
方法开始奏效,当然它总是创建更少的垃圾。在我的机器上,截止点是大约200个字符的字符串大小

此外,请参阅Guido的经典文章。虽然它的一些特定技术现在可能已经过时,但是关于如何思考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
通过删除生成器的创建,您可以将其速度提高一点(大约40%,但远没有原生C快)

而不是:

sum(ord(c) for c in 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

这将是最简单的。打印字符串中字符的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))

为什么这样一个函数应该是Python核心的一部分?我看不出它的一般用途…@timpietzcker:ascii值之和在对字符串进行散列时经常使用,例如滚动散列function@Michael只有一个非常糟糕的散列才会对值进行直接求和,通常需要加权。而且,正如所指出的,似乎最好使用更高级别的接口(比如
hash()
)而不是C语言。迈克尔:我不是不同意,我只是问为什么这样的函数足够有用,可以包含在核心语言中。这个问题有两个有争议的主张:一个,它将纯Python代码与嵌入式C代码进行比较,嵌入式C代码甚至不处理简单的溢出。因此,这种比较是无用的,有损于这个问题。其次,在语言中包含这样一个求和函数而不给出一个用例的建议是完全愚蠢的。(散列用例不算数,原因是unwind解释了。)在可预见的未来,Python核心的每一次添加都会带来维护和教学负担,并且需要由可演示的用例来覆盖。+1,谢谢,我搜索的这类答案,我现在就检查我已经测试过了,比我建议的更快,因此,这是一个很好的答案,它仍然比嵌入式c版本慢。同样的事情在python 3中也适用,您只需使用字节文字:
sum(array.array(“B”,B“abcdefgh”)
。任何python解决方案都会比嵌入式c版本慢,因为嵌入式c版本是完全不安全的。从理论上讲,基于numpy的解决方案可能同样快,但在实践中,它们必须分配numpy的数组对象,这相当便宜,但不是免费的。在使用2.7+1时,您可以避免
导入数组
求和(array.array('B','abcdefgh'))
而只需写入
求和(bytearray('abcdefgh'))
,它稍微快一点,但是数组方法是最快的,我已经编辑了这个问题来展示当前的结果。非常好的代码,谢谢
print sum(map(ord,my_string))
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))