有没有更快的方法将字符转换为整数并将其打印到 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 的函数)。