यह तुलनात्मक रूप से एक प्रकार का अजीब प्रदर्शन है क्योंकि आमतौर पर किसी पदार्थ की किसी चीज़ की गणना करने में लगने वाले समय को मापने के बजाय, यह देखने के बजाय कि एक निश्चित समय में कितने तुच्छ पुनरावृत्तियों को किया जा सकता है। मुझे आपके पायथन और जूलिया कोड को काम करने में परेशानी हो रही थी, इसलिए मैंने जूलिया कोड को काम करने के लिए संशोधित किया और सिर्फ पायथन कोड नहीं चलाया। जैसा कि @chepner ने एक टिप्पणी में कहा है, वस्तुओं के now()
साथ समय की तुलना करना और करना DateTime
काफी महंगा है। पायथन time.time()
फ़ंक्शन केवल एक फ़्लोटिंग-पॉइंट मान लौटाता है। जैसा कि यह पता चला है, एक जूलिया फंक्शन है जिसे time()
वही काम करता है:
julia> time()
1.587648091474481e9
यहां f()
मेरे सिस्टम पर आपके मूल कार्य (काम करने के लिए संशोधित) का समय है:
julia> using Dates
julia> function f()
i = 0
t1 = now()
while true
i += 1
if now() - t1 >= Millisecond(1000)
break
end
end
return i
end
f (generic function with 1 method)
julia> f()
4943739
इसने समय से पहले लगभग 5 मिलियन पुनरावृत्तियों को किया। जैसा कि मैंने कहा, मैं आपके सिस्टम पर महत्वपूर्ण फ़िडलिंग के बिना चलने के लिए आपका पायथन कोड प्राप्त करने में सक्षम नहीं था (जो कि मुझे परेशान नहीं करता था)। लेकिन यहाँ इसके बजाय इसके f()
उपयोग का एक संस्करण है time()
, जिसे मैं कल्पनाशील रूप से कॉल करूंगा g()
:
julia> function g()
i = 0
t1 = time()
while true
i += 1
if time() - t1 >= 1
break
end
end
return i
end
g (generic function with 1 method)
julia> g()
36087637
इस संस्करण ने 36 मिलियन पुनरावृत्तियों को किया। तो मुझे लगता है कि जूलिया लूपिंग में तेज है? वाह! खैर, वास्तव में इस लूप में मुख्य काम कॉल करने के लिए time()
है ... जूलिया बहुत सारे time()
कॉल उत्पन्न करने में तेज है !
यह समय क्यों अजीब है? जैसा कि मैंने कहा, यहां अधिकांश वास्तविक कार्य कॉलिंग हैं time()
। बाकी लूप वास्तव में कुछ भी नहीं करता है। एक अनुकूलन संकलित भाषा में, यदि कंपाइलर एक लूप देखता है जो कुछ भी नहीं करता है, तो यह इसे पूरी तरह से खत्म कर देगा। उदाहरण के लिए:
julia> function h()
t = 0
for i = 1:100_000_000
t += i
end
return t
end
h (generic function with 1 method)
julia> h()
5000000050000000
julia> @time h()
0.000000 seconds
5000000050000000
वाह, शून्य सेकंड! वो कैसे संभव है? ठीक है, चलो LLVM कोड (मशीन कोड की तरह लेकिन एक काल्पनिक मशीन के लिए उपयोग किया जाता है जो एक मध्यवर्ती प्रतिनिधित्व के रूप में देखें) में यह निम्न है:
julia> @code_llvm h()
; @ REPL[16]:1 within `h'
define i64 @julia_h_293() {
top:
; @ REPL[16]:6 within `h'
ret i64 5000000050000000
}
संकलक लूप को देखता है, यह पता लगाता है कि परिणाम हर बार समान होता है, और वास्तव में लूप को निष्पादित करने के बजाय केवल निरंतर मान देता है। जो निश्चित रूप से, शून्य समय लेता है।