<p>在处理性能关键代码的简短数据片段时,我不得不尝试不同的方法。根据您的应用程序,其中一个可能比其他更好。在</p>
<pre class="lang-py prettyprint-override"><code>def ensure_bytes__try(data):
try:
# memoryview used only for testing type; 'with' releases the view instantly
with memoryview(data):
return data
except TypeError:
return data.encode()
def ensure_bytes__isinstance(data):
# Explicitly test for some bytes-like types
# - misses array.array, numpy.array and all other types not listed here
return data if isinstance(data, (bytes, bytearray, memoryview)) else data.encode()
def ensure_bytes__hasattr(data):
# Works as long as your bytes-like doesn't have 'encode'
return data.encode() if hasattr(data, "encode") else data
def ensure_bytes__args(data=None, data_bytes=None):
# Avoid autodetection by using explicit arguments
return data_bytes if data is None else data.encode()
</code></pre>
<p>以下基准测试显示了Python 3.7.4上的每个实现所使用的时间:</p>
^{pr2}$
<p>短条意味着更快。每个条的浅色部分表示以<code>ref_bytes(b"foo")</code>(84 ns)和<code>ref_str("foo")</code>(100 ns)为基准的参考时间:</p>
<pre class="lang-py prettyprint-override"><code>def ref_bytes(data): return data
def ref_str(data): return data.encode()
</code></pre>