मेरे पास एक स्क्रिप्ट बनाने का एक कार्य है जो इनपुट के रूप में एक बड़ी टेक्स्ट फ़ाइल लेता है। इसके बाद सभी शब्दों और घटनाओं की संख्या को खोजने की आवश्यकता होती है और एक अद्वितीय शब्द और इसकी घटना प्रदर्शित करने वाली प्रत्येक पंक्ति के साथ एक नई फ़ाइल तैयार करने की आवश्यकता होती है।क्या यह शेल स्क्रिप्ट तेजी से बनाना संभव है?
एक उदाहरण के रूप में इस सामग्री के साथ एक फ़ाइल ले:
1 AD
1 ADIPISICING
1 ALIQUA
...
1 ALIQUIP
1 DO
2 DOLOR
2 DOLORE
...
इसके लिए मैं tr
, sort
का उपयोग कर एक पटकथा लिखी और:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud
exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure
dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
mollit anim id est laborum.
मैं जो इस तरह दिखता है एक फ़ाइल बनाने की आवश्यकता uniq
:
#!/bin/sh
INPUT=$1
OUTPUT=$2
if [ -a $INPUT ]
then
tr '[:space:][\-_?!.;\:]' '\n' < $INPUT |
tr -d '[:punct:][:special:][:digit:]' |
tr '[:lower:]' '[:upper:]' |
sort |
uniq -c > $OUTPUT
fi
यह क्या करता है es अंतरिक्ष को शब्दों द्वारा विभाजित करने के रूप में विभाजित करता है। यदि शब्द में -_?!.;:
है तो मैं उन्हें फिर से शब्दों में तोड़ देता हूं। मैं विराम चिह्न, विशेष वर्ण और अंक हटा देता हूं और संपूर्ण स्ट्रिंग को अपरकेस में परिवर्तित करता हूं। एक बार ऐसा करने के बाद मैं इसे सॉर्ट करता हूं और इसे प्रारूप में प्राप्त करने के लिए uniq
के माध्यम से पास करता हूं।
अब मैंने txt प्रारूप में बाइबल डाउनलोड की है और इसे इनपुट के रूप में उपयोग किया है। इस समय मुझे मिल गया:
import re
from collections import Counter
from itertools import chain
import sys
file = open(sys.argv[1])
c = Counter()
for line in file.readlines():
c.update([re.sub('[^a-zA-Z]', '', l).upper()
for l in chain(*[re.split('[-_?!.;:]', word)
for word in line.split()])])
file2 = open('output.txt', 'w')
for key in sorted(c):
file2.write(key + ' ' + str(c[key]) + '\n')
जब मैं स्क्रिप्ट मुझे मिल गया मार डाला:
scripts|$ time python text-to-word.py text.txt
python text-to-word.py text.txt 7.23s user 0.04s system 97% cpu 7.456 total
आप देख सकते हैं उस में भाग गया
scripts|$ time ./text-to-word.sh text.txt b
./text-to-word.sh text.txt b 16.17s user 0.09s system 102% cpu 15.934 total
मैं एक अजगर स्क्रिप्ट के साथ भी ऐसा ही किया 7.23s शेल स्क्रिप्ट की तुलना में 16.17s में चलाया गया था। मैंने बड़ी फाइलों के साथ प्रयास किया है और हमेशा पाइथन जीतने लगते हैं। मेरे ऊपर सेनेरियो के लिए कुछ प्रश्न हैं:
- पाइथन स्क्रिप्ट को तेजी से क्यों दिया जाता है कि खोल कमांड सी में लिखे गए हैं? मुझे एहसास है कि शेल स्क्रिप्ट इष्टतम नहीं हो सकता है।
- मैं शैल स्क्रिप्ट को कैसे सुधार सकता हूं?
- क्या मैं पाइथन लिपि में सुधार कर सकता हूं?
स्पष्ट होने के लिए मैं पाइथन को शैल स्क्रिप्ट पर तुलना नहीं कर रहा हूं। मैं लौ युद्ध शुरू करने की कोशिश नहीं कर रहा हूं या किसी अन्य भाषा में उत्तर की आवश्यकता नहीं है जो खुद को तेजी से तुलना कर रहा है। कार्य करने के लिए छोटे आदेशों को पाइप करने के यूनिक्स दर्शन का उपयोग करके, मैं शेल स्क्रिप्ट को तेज़ी से कैसे बना सकता हूं?
मैं की तरह कुछ करने के लिए शीर्षक बदलने सुझाव देंगे " क्या इस शेल स्क्रिप्ट को तेज़ी से बनाना संभव है? ", इतनी अलग पायथन लिपि ऑनल का उपयोग करना तुलना बिंदु के रूप में वाई। यह अजगर और खोल के बीच मतभेदों के बारे में बेकार और ऑफ-विषय चर्चाओं के जोखिम को खत्म कर देगा। –
मुझे नहीं लगता कि \ N निक्स दर्शन एक छोटे से काम करने वाले कई छोटे आदेशों का उपयोग करने के लिए है क्योंकि यह सबसे अधिक * कुशल * है। इसका कारण यह है कि हमारे पास मौजूद टूल के साथ, आप बहुत कुछ हासिल कर सकते हैं और अपने आप को एक साधारण कार्य के लिए एक नया कार्यक्रम विकसित करने में काफी समय बचा सकते हैं। – mgilson
पायथन भी सी में लिखा गया है। "सी में लिखित" होने के कारण चीजों को तेजी से बनाने के लिए पर्याप्त नहीं है - परतों को हस्तक्षेप करना (और पाइपलाइनों से और पढ़ने के लिए सभी पढ़ने/लिखना) ऊपर की ओर है। –