[英]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.