有没有更快的方法将字符转换为整数并将其打印到 python 的控制台?
Is there a faster way to convert characters to ints and print it to console for python?
我正在编写一个 python 应用程序,它基本上会读取一个串行端口中的内容,嗅探它,将它所说的内容输出到控制台,然后将其发送到另一个串行端口。反之亦然,换个方向。
但是,我需要所述应用以 ascii 码而不是它读取的字符输出它们。但是,问题是,当使用代码 print(str(ord(s)), end=',')
时,应用程序的速度似乎会大大降低,以至于导致应用程序发送串行命令超时。而使用代码 print(s, end=',')
则不会。
那么有没有更高效的方法将字符转换为int?
根据要求,这是此代码方法所在的完整代码。它实际上是在一个单独的线程上启动的,然后是主代码。没有为串行连接设置超时。
def sniff(com1, com2, b):
while True:
s = com1.read()
if b and s:
print(str(ord(s)), end=',')
else:
pass
if s:
com2.write(s)
即使在开始记录之前,一次一个字节的串行端口通信本身就很慢。你可能会越来越落后,是的,如果你有流量控制,你可以很容易地通过增加更多的延迟来导致你的源超时。 (如果你没有流量控制,你只会丢失数据。)
即使在添加 Python 之前,一次一个字节的序列也很糟糕。使用 Python 它变得更慢。
解决方法是一次做更多的字符。要启用此行为,您要做的第一件事是 在打开端口 时将超时值设置为 0。这样,read() 可以选择返回从零到大量字符的任意位置。但是,您不想选择一个非常大的数字,因为在输出端缺少 OS 缓冲会导致程序停止。
您想要执行的操作将如下所示:
# NOTE: timeout should be set to 0 on com1!!!
def sniff(com1, com2, b):
while True:
s = com1.read(16) # Tune this number...
if not s:
# No data received
time.sleep(0.001)
continue
if b:
display = ','.join(map(ord, s))
print(display, end=',')
com2.write(s)
如果速度仍然太慢,您还可以做一些其他事情。在进行打印之前进行写入可能会减少延迟,如果您想非常快,正确的答案可能是进行写入,然后将字符串放入队列,然后在另一个队列中进行字符串处理和打印线程。
我不确定是否有任何更快的方法来获取字符的 ascii 码,但是您可以通过不打印那么多次来节省时间,而是可以将字符连接成一个字符串,当字符串变大时,将整个连接的字符串打印出来。例子-
def sniff(com1, com2, b):
while True:
s = com1.read()
res = ''
if b and s:
res += str(ord(s)) + ','
if len(res) == <some high number>:
print(res, end='')
else:
pass
if s:
com2.write(s)
简单Example/Demo-
>>> import sys
>>> import io
>>> oldstdout = sys.stdout
>>> sys.stdout = io.StringIO()
>>> 'hello'
>>> def func1():
... s = 'abcdefghijklmnoqrstuwxyz'
... for c in s:
... print(c,end=',')
...
>>> def func2():
... s = 'abcdefghijklmnoqrstuwxyz'
... res = ''
... for c in s:
... res += c + ','
... print(res,end='')
...
>>>
>>> import timeit
>>> x = timeit.timeit(func1,number=100000)
>>> y = timeit.timeit(func2,number=100000)
>>> sys.stdout = oldstdout
>>> x
2.673666068058684
>>> y
0.41394731235161686
确保一次 read/write 多于一个字节,如 。
如果 s
实际上是一个字节串,例如 b'abc'
那么 print(*s, sep=',', end=',')
可以用在 Python 3 上,在这种情况下会产生 97,98,99,
。或 Python 上的 print(*bytearray(s), sep=',', end=',')
2(问题中的代码使用 print
作为暗示 from __future__ import print_function
的函数)。
我正在编写一个 python 应用程序,它基本上会读取一个串行端口中的内容,嗅探它,将它所说的内容输出到控制台,然后将其发送到另一个串行端口。反之亦然,换个方向。
但是,我需要所述应用以 ascii 码而不是它读取的字符输出它们。但是,问题是,当使用代码 print(str(ord(s)), end=',')
时,应用程序的速度似乎会大大降低,以至于导致应用程序发送串行命令超时。而使用代码 print(s, end=',')
则不会。
那么有没有更高效的方法将字符转换为int?
根据要求,这是此代码方法所在的完整代码。它实际上是在一个单独的线程上启动的,然后是主代码。没有为串行连接设置超时。
def sniff(com1, com2, b):
while True:
s = com1.read()
if b and s:
print(str(ord(s)), end=',')
else:
pass
if s:
com2.write(s)
即使在开始记录之前,一次一个字节的串行端口通信本身就很慢。你可能会越来越落后,是的,如果你有流量控制,你可以很容易地通过增加更多的延迟来导致你的源超时。 (如果你没有流量控制,你只会丢失数据。)
即使在添加 Python 之前,一次一个字节的序列也很糟糕。使用 Python 它变得更慢。
解决方法是一次做更多的字符。要启用此行为,您要做的第一件事是 在打开端口 时将超时值设置为 0。这样,read() 可以选择返回从零到大量字符的任意位置。但是,您不想选择一个非常大的数字,因为在输出端缺少 OS 缓冲会导致程序停止。
您想要执行的操作将如下所示:
# NOTE: timeout should be set to 0 on com1!!!
def sniff(com1, com2, b):
while True:
s = com1.read(16) # Tune this number...
if not s:
# No data received
time.sleep(0.001)
continue
if b:
display = ','.join(map(ord, s))
print(display, end=',')
com2.write(s)
如果速度仍然太慢,您还可以做一些其他事情。在进行打印之前进行写入可能会减少延迟,如果您想非常快,正确的答案可能是进行写入,然后将字符串放入队列,然后在另一个队列中进行字符串处理和打印线程。
我不确定是否有任何更快的方法来获取字符的 ascii 码,但是您可以通过不打印那么多次来节省时间,而是可以将字符连接成一个字符串,当字符串变大时,将整个连接的字符串打印出来。例子-
def sniff(com1, com2, b):
while True:
s = com1.read()
res = ''
if b and s:
res += str(ord(s)) + ','
if len(res) == <some high number>:
print(res, end='')
else:
pass
if s:
com2.write(s)
简单Example/Demo-
>>> import sys
>>> import io
>>> oldstdout = sys.stdout
>>> sys.stdout = io.StringIO()
>>> 'hello'
>>> def func1():
... s = 'abcdefghijklmnoqrstuwxyz'
... for c in s:
... print(c,end=',')
...
>>> def func2():
... s = 'abcdefghijklmnoqrstuwxyz'
... res = ''
... for c in s:
... res += c + ','
... print(res,end='')
...
>>>
>>> import timeit
>>> x = timeit.timeit(func1,number=100000)
>>> y = timeit.timeit(func2,number=100000)
>>> sys.stdout = oldstdout
>>> x
2.673666068058684
>>> y
0.41394731235161686
确保一次 read/write 多于一个字节,如
如果 s
实际上是一个字节串,例如 b'abc'
那么 print(*s, sep=',', end=',')
可以用在 Python 3 上,在这种情况下会产生 97,98,99,
。或 Python 上的 print(*bytearray(s), sep=',', end=',')
2(问题中的代码使用 print
作为暗示 from __future__ import print_function
的函数)。