簡體   English   中英

結構空字節vs \\ x00

[英]Struct null byte vs \x00

用以下命令寫一個空字節有什么區別?

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只比打印一次更快?


編輯:

使用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

如果您使用的是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值和表示為Python字節對象的C結構之間執行轉換。

編輯

有關性能的說明:b'\\ x00'是文字。 與函數調用相比,文字的求值總是更快。

她們不一樣。

print("\x00")

這將打印unicode代碼點0; Unicode將被解碼為終端的編碼(默認為utf-8),並且相應的字節將被發送到您進程的stdout

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

這將打印空字節表示形式。 由於struct.pack()的結果是一個字節字符串,因此python不會嘗試對其進行編碼,而print()會將其轉換為表示形式:

>>> print('\x00')

>>> import struct
>>> print(struct.pack("B", 0))
b'\x00'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM