Нулевой байт структуры vs \ x00 - PullRequest
0 голосов
/ 05 июля 2018

В чем разница между записью нулевого байта с помощью:

print("\x00")

И написание одного с:

print(struct.pack("B", 0))

Я взял на себя смелость рассчитать время их выполнения следующим образом:

def struct_exec_time():
    start_time = time.time()
    import struct
    print(struct.pack("B",0))
    return time.time() - start_time

def simple_print_exec():
    start_time = time.time()
    print("\x00")
    return time.time() - start_time

При запуске их обоих:

>>> for _ in range(1):
...     print("Struct execution time: {}".format(struct_exec_time()))
...     print("Simple print execution time: {}".format(simple_print_exec()))
... 

Struct execution time: 2.38418579102e-05

Simple print execution time: 3.09944152832e-06
>>> 

Кажется, что struct быстрее, чем функция print для первого выполнения, потому что если вы запустите их более одного раза:

>>> for _ in range(5):
...     print("Struct execution time: {}".format(struct_exec_time()))
...     print("Simple print execution time: {}".format(simple_print_exec()))
... 

Struct execution time: 2.71797180176e-05

Simple print execution time: 5.00679016113e-06

Struct execution time: 9.05990600586e-06

Simple print execution time: 4.05311584473e-06

Struct execution time: 7.15255737305e-06

Simple print execution time: 5.00679016113e-06

Struct execution time: 7.15255737305e-06

Simple print execution time: 4.05311584473e-06

Struct execution time: 6.91413879395e-06

Simple print execution time: 4.76837158203e-06

Итак, в чем разница между ними и почему struct только быстрее, чем печатать один раз?


Edit:

С вызовом import struct, снятым с таймера:

def struct_exec_time():
    import struct
    start_time = time.time()
    print(struct.pack("B",0))
    return time.time() - start_time

for _ in range(5):
    print("Struct exec: {}".format(struct_exec_time()))
    print("Print exec: {}".format(simple_print_exec()))


Struct exec: 3.40938568115e-05

Print exec: 2.86102294922e-06

Struct exec: 2.86102294922e-06

Print exec: 3.09944152832e-06

Struct exec: 2.86102294922e-06

Print exec: 3.09944152832e-06

Struct exec: 3.81469726562e-06

Print exec: 3.09944152832e-06

Struct exec: 2.86102294922e-06

Print exec: 2.14576721191e-06

Ответы [ 2 ]

0 голосов
/ 06 июля 2018

Если вы используете Python 2.7, два значения равны и имеют одинаковый тип: str (= Python 3 bytes).

Вот тест Python 2/3:

import struct

b1 = struct.pack('B', 0)
b2 = b'\x00'

assert b1 == b2
assert type(b1) == type(b2)

В повседневном программировании я бы предпочел использовать строку байтов вместо struct.

Цитирование документации:

Этот модуль выполняет преобразования между значениями Python и структурами C, представленными в виде байтовых объектов Python.

Редактировать

Примечание о производительности: b '\ x00' - это литерал. По сравнению с вызовом функции вычисление литерала всегда происходит быстрее.

0 голосов
/ 05 июля 2018

Они не одинаковы.

print("\x00")

Это печатает кодовую точку Unicode 0; Юникод будет декодирован в кодировку вашего терминала (по умолчанию utf-8), а соответствующие байты будут отправлены вашему процессу 'stdout

print(struct.pack("B", 0))

Это печатает нулевое представление байта. Поскольку результатом struct.pack () является строка байтов, python не будет пытаться ее кодировать и print() преобразует ее в представление:

>>> print('\x00')

>>> import struct
>>> print(struct.pack("B", 0))
b'\x00'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...