এই পৃষ্ঠা থেকে , আমরা জানি যে:
চেইনযুক্ত তুলনা
and
অপারেটরটি ব্যবহার করার চেয়ে দ্রুত ।x < y < z
পরিবর্তে লিখুনx < y and y < z
।
তবে, নিম্নলিখিত কোড স্নিপেটগুলি পরীক্ষা করে আমি একটি ভিন্ন ফলাফল পেয়েছি:
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.8" "x < y < z"
1000000 loops, best of 3: 0.322 usec per loop
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.8" "x < y and y < z"
1000000 loops, best of 3: 0.22 usec per loop
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.1" "x < y < z"
1000000 loops, best of 3: 0.279 usec per loop
$ python -m timeit "x = 1.2" "y = 1.3" "z = 1.1" "x < y and y < z"
1000000 loops, best of 3: 0.215 usec per loop
মনে হচ্ছে যে x < y and y < z
দ্রুত চেয়ে x < y < z
। কেন?
এই সাইটের (মত কিছু পোস্ট অনুসন্ধানের পর এই এক ) আমি জানি যে, "শুধুমাত্র একবার মূল্যায়ন" জন্য চাবিকাঠি x < y < z
অবশ্য আমি এখনও বিভ্রান্ত করছি। আরও অধ্যয়ন করার জন্য, আমি এই দুটি ফাংশন ব্যবহার করে পৃথক করেছিলাম dis.dis
:
import dis
def chained_compare():
x = 1.2
y = 1.3
z = 1.1
x < y < z
def and_compare():
x = 1.2
y = 1.3
z = 1.1
x < y and y < z
dis.dis(chained_compare)
dis.dis(and_compare)
এবং আউটপুটটি হ'ল:
## chained_compare ##
4 0 LOAD_CONST 1 (1.2)
3 STORE_FAST 0 (x)
5 6 LOAD_CONST 2 (1.3)
9 STORE_FAST 1 (y)
6 12 LOAD_CONST 3 (1.1)
15 STORE_FAST 2 (z)
7 18 LOAD_FAST 0 (x)
21 LOAD_FAST 1 (y)
24 DUP_TOP
25 ROT_THREE
26 COMPARE_OP 0 (<)
29 JUMP_IF_FALSE_OR_POP 41
32 LOAD_FAST 2 (z)
35 COMPARE_OP 0 (<)
38 JUMP_FORWARD 2 (to 43)
>> 41 ROT_TWO
42 POP_TOP
>> 43 POP_TOP
44 LOAD_CONST 0 (None)
47 RETURN_VALUE
## and_compare ##
10 0 LOAD_CONST 1 (1.2)
3 STORE_FAST 0 (x)
11 6 LOAD_CONST 2 (1.3)
9 STORE_FAST 1 (y)
12 12 LOAD_CONST 3 (1.1)
15 STORE_FAST 2 (z)
13 18 LOAD_FAST 0 (x)
21 LOAD_FAST 1 (y)
24 COMPARE_OP 0 (<)
27 JUMP_IF_FALSE_OR_POP 39
30 LOAD_FAST 1 (y)
33 LOAD_FAST 2 (z)
36 COMPARE_OP 0 (<)
>> 39 POP_TOP
40 LOAD_CONST 0 (None)
দেখে মনে হচ্ছে এর x < y and y < z
চেয়ে কম বিচ্ছিন্ন কমান্ড রয়েছে x < y < z
। আমি x < y and y < z
তুলনায় দ্রুত বিবেচনা করা উচিত x < y < z
?
পাইথন 2.7.6 এর সাথে একটি ইন্টেল (আর) জিয়ন (আর) সিপিইউ E5640 @ 2.67GHz এ পরীক্ষিত।
y
কেবল কোনও পরিবর্তনশীল অনুসন্ধান নয়, তবে একটি ফাংশন কলের মতো আরও ব্যয়বহুল প্রক্রিয়া? অর্থাত্ 10 < max(range(100)) < 15
দ্রুত হয় 10 < max(range(100)) and max(range(100)) < 15
কারণ max(range(100))
উভয় তুলনার জন্য একবার বলা হয়।
timeit
পরীক্ষাগুলি দেখে আমি এতে আগ্রহী।