[英]How to compare strings in python 2 and 3?
我在玩一些python,並想出了以下代碼:
import time
N = 10000000
t1 = time.time()
for _ in range(N):
if 'lol' in ['lol']:
pass
print(time.time() - t1)
t1 = time.time()
for _ in range(N):
if 'lol' == 'lol':
pass
print(time.time() - t1)
因此,如果我使用python2
:
(test) C:\Users\test>python test.py
0.530999898911
0.5
(test) C:\Users\test>python test.py
0.531000137329
0.5
(test) C:\Users\test>python test.py
0.528000116348
0.501000165939
很好-我喜歡第二個變體更快,我應該使用'lol' == 'lol'
因為這是比較Python的比較兩個字符串的方式。 但是,如果我使用python3
會發生什么:
(test) C:\Users\test>python3 test.py
0.37500524520874023
0.3880295753479004
(test) C:\Users\test>python3 test.py
0.3690001964569092
0.3780345916748047
(test) C:\User\test>python3 test.py
0.37799692153930664
0.38797974586486816
使用timeit:
(test) C:\Users\test>python3 -m timeit "'lol' in ['lol']"
100000000 loops, best of 3: 0.0183 usec per loop
(test) C:\Users\test>python3 -m timeit "'lol' == 'lol'"
100000000 loops, best of 3: 0.019 usec per loop
我的天哪! 為什么第一個變體更快? 因此,當我使用python3
時,應該'lol' in ['lol']
使用類似'lol' in ['lol']
丑陋樣式嗎?
python2的大部分時間是通過調用range
構造一個巨大的列表。 在Python 2中將其更改為xrange
,或使用正確編寫的timeit模塊。 完成此操作后,您將不會發現明顯的差異,這些差異會激發編寫看起來很奇怪的代碼。
因此,當我使用python3時,應該在['lol']中使用像'lol'這樣的丑陋樣式嗎?
不, 可讀性很重要 。
另外,正如其他人指出的那樣,您的測試用例也有不足之處:
$ python3 -m timeit "'lol' == 'lol'"
>> 10000000 loops, best of 3: 0.024 usec per loop
$ python3 -m timeit "'lol' in ['lol']"
>> 10000000 loops, best of 3: 0.0214 usec per loop
$ python2 -m timeit "'lol' == 'lol'"
>> 10000000 loops, best of 3: 0.0258 usec per loop
$ python2 -m timeit "'lol' in ['lol']"
>> 10000000 loops, best of 3: 0.0212 usec per loop
python2和python3在比較上沒有什么區別。
另一個引起混亂的原因可能是由於python解釋器[1]在字符串緩存/內部處理方面的不透明行為。 根據經驗,會插入少於四個字符的字符串,並將它們指向同一對象。 可以用類似的東西測試
a = 'lol'
b = 'lol'
a is b # tests for object id instead of applying an equality comparison
>> True
也可以插入其他字符串,但是一個簡單的反例是包含4個字符的字符串之一,其中包括特殊字符:
a = '####'
b = '####'
a is b
>> False
當然,測試對象ID比進行實際比較要快,而使用in
進行測試就可以做到。 即使代碼本身看起來很直接,實際的操作還是出乎意料的。 這也意味着略有不同的方案可能會導致令人驚訝的結果和有趣的錯誤。
最后,我再重復一遍:不,您不應該選擇比較的第二個變體而不是第一個。
[1]: 僅CPython 。 我不知道其他python解釋器是否也做類似的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.