我目前正在嘗試清理/改進一些我終于開始作業的代碼。
在 while 回圈和重復寫入一定次數的相同命令之間,兩者中的哪一個更快。
例如。
count = 0
while count < 10:
print('hello')
count = 1
或者
print('hello')
print('hello')
print('hello')
print('hello')
print('hello')
print('hello')
print('hello')
print('hello')
print('hello')
print('hello')
while 回圈更干凈,但它更快嗎?我對此還是很陌生,所以我的理解是,就上述程式代碼而言,while 回圈將總共運行 32 條陳述句,而僅列印陳述句僅運行 10 次:
- 計數最初設定為零
- while 評估計數小于 10 (0)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (1)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (2)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (3)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (4)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (5)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (6)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (7)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (8)
- 你好被列印
- 計數加一
- while 評估計數小于 10 (9)
- 你好被列印
- 計數加一
- while 評估計數不再小于 10 (10) While 回圈中斷并處理結束
基于以上所述,我認為 while 回圈的優勢在于代碼的簡潔性和撰寫代碼的速度(不一定是執行速度,盡管計算機如此強大,但人們不會注意到。)
我在上述假設中正確嗎?
編輯:這很快,我看到一些答案證實了我對優化的最初想法。謝謝。
上面的代碼示例與我的專案無關,只是為了表示理解。
uj5u.com熱心網友回復:
如果有疑問:測量。
什么是更好的?
- 更少的位元組碼?==>
import dis并比較位元組碼 - 更快的執行 ==>
import timeit并比較運行時 - 可讀性 ==> 取決于您最弱的同事理解1您的代碼的能力(以
import this2 作為代碼運行檔案;o)
像這樣:
import dis
import timeit
def a():
count = 0
p = print # local caching of global lookup - way faster
while count < 10:
p('hello', flush=True)
count = 1
def b():
p = print # local caching of global lookup - way faster
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
p('hello', flush=True)
def c():
print( *("hello" for _ in range(10)), sep="\n", flush=True)
aa = timeit.timeit(a, number=100)
bb = timeit.timeit(b, number=100)
cc = timeit.timeit(c, number=100)
print(aa, bb, cc, sep="\n")
dis.dis(a)
print("-"*80)
dis.dis(b)
print("-"*80)
dis.dis(c)
要得到
0.059448799999699986 # while is faster - who would have thought
0.06415420000030281 # multiple prints
0.06454990000020189 # one print but list comp
# while loop - seems to be shortest
5 0 LOAD_CONST 1 (0)
2 STORE_FAST 0 (count)
6 4 LOAD_GLOBAL 0 (print)
6 STORE_FAST 1 (p)
7 8 LOAD_FAST 0 (count)
10 LOAD_CONST 2 (10)
12 COMPARE_OP 0 (<)
14 POP_JUMP_IF_FALSE 24 (to 48)
8 >> 16 LOAD_FAST 1 (p)
18 LOAD_CONST 3 ('hello')
20 LOAD_CONST 4 (True)
22 LOAD_CONST 5 (('flush',))
24 CALL_FUNCTION_KW 2
26 POP_TOP
9 28 LOAD_FAST 0 (count)
30 LOAD_CONST 6 (1)
32 INPLACE_ADD
34 STORE_FAST 0 (count)
7 36 LOAD_FAST 0 (count)
38 LOAD_CONST 2 (10)
40 COMPARE_OP 0 (<)
42 POP_JUMP_IF_TRUE 8 (to 16)
44 LOAD_CONST 0 (None)
46 RETURN_VALUE
>> 48 LOAD_CONST 0 (None)
50 RETURN_VALUE
--------------------------------------------------------------------------------
# multiple prints
11 0 LOAD_GLOBAL 0 (print)
2 STORE_FAST 0 (p)
12 4 LOAD_FAST 0 (p)
6 LOAD_CONST 1 ('hello')
8 LOAD_CONST 2 (True)
10 LOAD_CONST 3 (('flush',))
12 CALL_FUNCTION_KW 2
14 POP_TOP
13 16 LOAD_FAST 0 (p)
18 LOAD_CONST 1 ('hello')
20 LOAD_CONST 2 (True)
22 LOAD_CONST 3 (('flush',))
24 CALL_FUNCTION_KW 2
26 POP_TOP
14 28 LOAD_FAST 0 (p)
30 LOAD_CONST 1 ('hello')
32 LOAD_CONST 2 (True)
34 LOAD_CONST 3 (('flush',))
36 CALL_FUNCTION_KW 2
38 POP_TOP
15 40 LOAD_FAST 0 (p)
42 LOAD_CONST 1 ('hello')
44 LOAD_CONST 2 (True)
46 LOAD_CONST 3 (('flush',))
48 CALL_FUNCTION_KW 2
50 POP_TOP
16 52 LOAD_FAST 0 (p)
54 LOAD_CONST 1 ('hello')
56 LOAD_CONST 2 (True)
58 LOAD_CONST 3 (('flush',))
60 CALL_FUNCTION_KW 2
62 POP_TOP
17 64 LOAD_FAST 0 (p)
66 LOAD_CONST 1 ('hello')
68 LOAD_CONST 2 (True)
70 LOAD_CONST 3 (('flush',))
72 CALL_FUNCTION_KW 2
74 POP_TOP
18 76 LOAD_FAST 0 (p)
78 LOAD_CONST 1 ('hello')
80 LOAD_CONST 2 (True)
82 LOAD_CONST 3 (('flush',))
84 CALL_FUNCTION_KW 2
86 POP_TOP
19 88 LOAD_FAST 0 (p)
90 LOAD_CONST 1 ('hello')
92 LOAD_CONST 2 (True)
94 LOAD_CONST 3 (('flush',))
96 CALL_FUNCTION_KW 2
98 POP_TOP
20 100 LOAD_FAST 0 (p)
102 LOAD_CONST 1 ('hello')
104 LOAD_CONST 2 (True)
106 LOAD_CONST 3 (('flush',))
108 CALL_FUNCTION_KW 2
110 POP_TOP
21 112 LOAD_FAST 0 (p)
114 LOAD_CONST 1 ('hello')
116 LOAD_CONST 2 (True)
118 LOAD_CONST 3 (('flush',))
120 CALL_FUNCTION_KW 2
122 POP_TOP
124 LOAD_CONST 0 (None)
126 RETURN_VALUE
--------------------------------------------------------------------------------
# fancy generator comprehension
24 0 LOAD_GLOBAL 0 (print)
2 LOAD_CONST 1 (<code object <genexpr> at 0x000002320A8468C0, file "c:\Users\partner\Documents\Coding\python\t.py", line 24>)
4 LOAD_CONST 2 ('c.<locals>.<genexpr>')
6 MAKE_FUNCTION 0
8 LOAD_GLOBAL 1 (range)
10 LOAD_CONST 3 (10)
12 CALL_FUNCTION 1
14 GET_ITER
16 CALL_FUNCTION 1
18 LOAD_CONST 4 ('\n')
20 LOAD_CONST 5 (True)
22 LOAD_CONST 6 (('sep', 'flush'))
24 BUILD_CONST_KEY_MAP 2
26 CALL_FUNCTION_EX 1
28 POP_TOP
30 LOAD_CONST 0 (None)
32 RETURN_VALUE
Disassembly of <code object <genexpr> at 0x000002320A8468C0, file "c:\Users\partner\Documents\Coding\python\t.py", line 24>:
0 GEN_START 0
24 2 LOAD_FAST 0 (.0)
>> 4 FOR_ITER 5 (to 16)
6 STORE_FAST 1 (_)
8 LOAD_CONST 0 ('hello')
10 YIELD_VALUE
12 POP_TOP
14 JUMP_ABSOLUTE 2 (to 4)
>> 16 LOAD_CONST 1 (None)
18 RETURN_VALUE
1) 由 Robert A. Heinlein 在他的科幻小說Stranger in a Strange Source中創造。
2) Python之禪
uj5u.com熱心網友回復:
我認為這取決于編譯器。此外,for 回圈也比 while 更好,因為 while 每次都會評估條件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464781.html
上一篇:不允許yml檔案中的重復標簽
