यह एक अनुवर्ती है कि पायथन वास्तव में कितना धीमा है? (या आपकी भाषा कितनी तेज़ है?) ।
यह पता चला है कि मेरे अंतिम प्रश्न के लिए x100 स्पीडअप प्राप्त करना थोड़ा आसान था। उन लोगों के लिए जिन्होंने चुनौती का आनंद लिया है, लेकिन कुछ कठिन चाहते हैं जहां वे वास्तव में अपने निम्न स्तर के कौशल का उपयोग कर सकें, यहां भाग II है। मेरे कंप्यूटर पर परीक्षण के अनुसार निम्नलिखित अजगर कोड के लिए x100 स्पीडअप प्राप्त करने की चुनौती है।
इसे और अधिक कठिन बनाने के लिए मैं इस समय पेपी का उपयोग कर रहा हूं। मेरे लिए वर्तमान समय pypy 2.2.1 का उपयोग करके 1 मिनट और 7 सेकंड है ।
नियम
- कोड जमा करने वाला पहला व्यक्ति जो मैं चला सकता हूं, सही है और मेरी मशीन पर x100 गुना तेजी से 50 अंकों का इनाम दिया जाएगा।
- मैं एक सप्ताह के बाद सबसे तेज कोड में जीत हासिल करूंगा।
import itertools
import operator
import random
n = 8
m = 8
iters = 1000
# creates an array of 0s with length m
# [0, 0, 0, 0, 0, 0, 0, 0]
leadingzerocounts = [0]*m
# itertools.product creates an array of all possible combinations of the
# args passed to it.
#
# Ex:
# itertools.product("ABCD", "xy") --> Ax Ay Bx By Cx Cy Dx Dy
# itertools.product("AB", repeat=5) --> [
# ('A', 'A', 'A', 'A', 'A'),
# ('A', 'A', 'A', 'A', 'B'),
# ('A', 'A', 'A', 'B', 'A'),
# ('A', 'A', 'A', 'B', 'B'),
# etc.
# ]
for S in itertools.product([-1,1], repeat = n+m-1):
for i in xrange(iters):
F = [random.choice([-1,0,0,1]) for j in xrange(n)]
# if the array is made up of only zeros keep recreating it until
# there is at least one nonzero value.
while not any(F):
F = [random.choice([-1,0,0,1]) for j in xrange(n)]
j = 0
while (j < m and sum(map(operator.mul, F, S[j:j+n])) == 0):
leadingzerocounts[j] +=1
j += 1
print leadingzerocounts
आउटपुट के समान होना चाहिए
[6335185, 2526840, 1041967, 439735, 193391, 87083, 40635, 19694]
आपको अपने कोड में एक यादृच्छिक बीज का उपयोग करना होगा और कोई भी यादृच्छिक संख्या जनरेटर जो उत्तर के करीब देने के लिए पर्याप्त है, स्वीकार किया जाएगा।
माई मशीन द टाइमिंग मेरी मशीन पर चलाई जाएगी। यह एक मानक ubuntu एक AMD FX-8350 आठ-कोर प्रोसेसर पर स्थापित है। इसका मतलब यह भी है कि मुझे आपका कोड चलाने में सक्षम होना चाहिए।
कोड की व्याख्या
यह कोड लंबाई ए + एम -1 के सभी सरणियों पर निर्भर करता है जो -1 और 1 एस के लिए बने होते हैं। प्रत्येक सरणी के लिए यह प्रत्येक मान लेने की 1/4, 1/2, / 14 की संभावना के साथ -1,0 या 1 से बना लंबाई के 1000 गैर-शून्य यादृच्छिक सरणियों एफ का नमूना लेता है। यह तब तक F और N की प्रत्येक विंडो के बीच आंतरिक उत्पादों की गणना करता है, जब तक कि यह एक गैर-शून्य आंतरिक उत्पाद न मिल जाए। यह leadingzerocounts
प्रत्येक स्थिति में 1 जोड़ता है इसमें एक शून्य आंतरिक उत्पाद पाया गया।
स्थिति
पर्ल । 2.7 बार @tobyink द्वारा मंदी। (Ppyy की तुलना में cpython नहीं है।)
जे । 39 बार स्पीडअप @Eelvex द्वारा।
- सी । 59 बार @ स्पीड से गति।
- जूलिया । 197 बार तेजी से @ एक-अधिक-मिनट द्वारा स्टार्ट अप समय शामिल नहीं है। स्टार्ट अप टाइम सहित 8.5 गुना गति है (यह 8 की तुलना में इस मामले में 4 प्रोसेसर का उपयोग करके तेज है)।
- फोरट्रान । 438 गुना @ सेमी-एक्सट्रिंसिक द्वारा गति।
- Rpython । 258 मिनट @primo द्वारा गति।
- सी ++ । @Ilmale द्वारा 508 गुना गति।
(मैंने नए सुधारों को समय पर रोक दिया क्योंकि वे बहुत तेज़ हैं और इटर्स बहुत छोटा था।)
यह बताया गया था कि एक सेकंड से नीचे का समय अविश्वसनीय है और कुछ भाषाओं में स्टार्ट-अप लागत भी है। तर्क यह है कि यदि आपको यह शामिल करना है कि आपको C / C ++ इत्यादि का संकलन समय भी शामिल करना चाहिए, तो सबसे तेज़ कोड के लिए टाइमिंग्स हैं जिनकी संख्या 100,000 तक बढ़ गई है।
- जूलिया । 42 सेकंड @ एक मिनट से अधिक।
- सी ++ । 14 सेकंड @GuySirton द्वारा।
- फोरट्रान । 14 से @ अर्ध-बहिष्कृत।
- सी ++ । 12s @ilmale द्वारा।
- Rpython । 18 सेकंड @primo द्वारा।
- सी ++ । 5s @Stefan द्वारा।
विजेता है .. स्टीफन!
अनुवर्ती चुनौती पोस्ट की गई। तुम कितनी ऊंचाई तक जाने में सक्षम हो? (एक कोडिंग + एल्गोरिदम चुनौती) । यह एक कठिन है।