6 ^ 6 ^ 6 মূল্যায়নে পাইথন বনাম বিসি


29

আমি অভিব্যক্তি মূল্যায়নের করছি 6^6^6ব্যবহার pythonএবং bcআলাদাভাবে।

পাইথন ফাইলের বিষয়বস্তুটি হ'ল print 6**6**6। যখন আমি এক্সিকিউট করি time python test.py, আমি আউটপুট হিসাবে পাই

real        0m0.067s
user        0m0.050s
sys         0m0.011s

এবং তারপরে, আমি কমান্ডটি চালিয়েছি time echo 6^6^6 | bcযা আমাকে নিম্নলিখিত আউটপুট দিয়েছে

real        0m0.205s
user        0m0.197s
sys         0m0.005s

এই ফলাফলগুলি থেকে এটি স্পষ্ট যে অজগর এবং বিসি দ্বারা গৃহীত sys সময় যথাক্রমে 11 মিমি এবং 5 মিমি ছিল। খ্রিস্টপূর্ব কমান্ড sys সময় পর্যায়ে পাইথন ছাপিয়ে গিয়েছিল কিন্তু যখন এটা আসে ব্যবহারকারী এবং বাস্তব সময়ে পাইথন প্রায় 4 বার বিসি তুলনায় দ্রুততর ছিল । সেখানে কি চলে যেতে পারে। প্রক্রিয়াগুলিকে আমি কোনও অগ্রাধিকার দিইনি। আমি এই পরিস্থিতিটি বোঝার চেষ্টা করছি।


সুতরাং আপনি কী বোঝাতে চেয়েছেন যে সিস্টেম উপাদানগুলি কেবল লোড হতে সময় দেয় এবং রানটাইম আউটপুটটির ব্যবহারকারীর অংশে দেওয়া হবে?
গণেশ

আমি সত্যিই নিশ্চিত নই, এ কারণেই আমি একটি মন্তব্য পোস্ট করেছি। এটি কেবল অনুমান মাত্র।
terdon

7
echo | bcপাইপের কারণে সাবসেল চালু করা জড়িত - এটির কারণেই সম্ভবত আপনার অতিরিক্ত ব্যবহারকারীর কিছু সময় এসেছে। এটি একটি ন্যায়সঙ্গত পরীক্ষা করার জন্য, পাইথন স্ক্রিপ্টটি স্টিডিন থেকে পড়তে হবে যাতে আপনি পারেন time echo 6**6**6 | whatever.py
স্বর্ণলোক

1
আমি বরং কমান্ড লাইনটি একটি স্ক্রিপ্টে রেখেছি এবং এটি কার্যকর করার সময় time বা ব্যবহার echo 6^6^6 | time bc
ড্যানিয়েল কুলম্যান

1
পার্শ্ব দ্রষ্টব্য: পাইথনে 6**6**6এক্সপ্রেশনটি আসলে সংকলনের সময় গণনা করা হয় । তবে যেহেতু আপনি ফাইলটি মডিউল থেকে আমদানি না করে সরাসরি প্রবর্তন করছেন, এটি কোনও বিষয় নয়। 10**12345678কোনও a.pyফাইলের মধ্যে রাখা পার্থক্যটি দেখতে এবং ইন্টারেক্টিভ ইন্টারপ্রেটার থেকে এটি আমদানির চেষ্টা করুন। তারপরে দোভাষী বন্ধ করুন, এটি পুনরায় চালু করুন এবং aআবার আমদানি করুন । প্রথমবার এটা (কারণ পাইথন মডিউল কম্পাইল হচ্ছে) সময় একজন লক্ষণীয় পরিমাণ গ্রহণ করা উচিত, যখন দ্বিতীয় সময় লোড .pycহয়, যা ক্ষণিক হওয়া উচিত,
Bakuriu

উত্তর:


25

পাইথন প্রারম্ভকালে প্রচুর সংখ্যক ফাইল আমদানি করে:

% python -c 'import sys; print len(sys.modules)'
39

এগুলির প্রত্যেকটির জন্য পাইথন ফাইল খোলার ক্ষেত্রে আরও বেশি সংখ্যক প্রচেষ্টা প্রয়োজন কারণ মডিউলটি সংজ্ঞায়িত করার অনেকগুলি উপায় রয়েছে:

% python -vv -c 'pass'
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# trying site.so
# trying sitemodule.so
# trying site.py
# trying site.pyc
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sitemodule.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py
# /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.py
import site # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site.pyc
# trying os.so
# trying osmodule.so
# trying os.py
# trying os.pyc
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/osmodule.so
# trying /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py
# /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc matches /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py
import os # precompiled from /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.pyc
    ...

প্রতিটি "চেষ্টা", যা অন্তর্নির্মিত তাদের ব্যতীত, একটি ওএস-লেভেল / সিস্টেম কল প্রয়োজন এবং প্রতিটি "আমদানি" প্রায় 8 "চেষ্টা" বার্তাগুলি ট্রিগার করে বলে মনে হয়। (জিপিমপোর্ট ব্যবহার করে এটি হ্রাস করার বিভিন্ন উপায় ছিল এবং আপনার পাইথনপথের প্রতিটি পাথের জন্য অন্য কল প্রয়োজন হতে পারে))

এর অর্থ আমার মেশিনে পাইথন শুরু হওয়ার আগে প্রায় 200 টি স্ট্যাট সিস্টেম কল রয়েছে এবং "সময়" "ব্যবহারকারী" এর পরিবর্তে "সিস্টেমে" নির্ধারিত করে, কারণ ব্যবহারকারী প্রোগ্রাম সিস্টেমে কাজ করার জন্য অপেক্ষা করে।

তুলনা করে এবং টেরডনের মতো বলেছিলেন, "বিসি" এর কোনও প্রারম্ভিক ব্যয় বেশি হয় না। ডিটিআরএস আউটপুট (আমার কাছে একটি ম্যাক আছে; লিনাক্স-ভিত্তিক ওএসের জন্য "স্ট্রেস") দেখে আমি দেখতে পাচ্ছি যে বিসি কিছু ভাগ করে নেওয়া লোড করা বাদ দিয়ে কোনও নিজস্ব () বা স্ট্যাট () সিস্টেম কল করে না গ্রন্থাগারগুলি হ'ল সূচনা, অবশ্যই পাইথন পাশাপাশি করে। এছাড়াও, পাইথনের আরও কিছু ফাইল পড়ার রয়েছে, এটি কোনও প্রক্রিয়া করার জন্য প্রস্তুত হওয়ার আগে।

ডিস্কের জন্য অপেক্ষা করা ধীর।

আপনি পাইথনের স্টার্টআপ ব্যয়ের জন্য একটি ধারণা পেতে পারেন:

time python -c pass

এটি আমার মেশিনে 0.032s, যখন 'প্রিন্ট 6 ** 6 ** 6' 0.032s, সুতরাং প্রারম্ভকালীন ব্যয় সামগ্রিক সময়ের 1/2 তম এবং গণনা + দশমিক রূপান্তরটি অন্য অর্ধেক। যদিও:

time echo 1 | bc

0.005s সময় নেয়, এবং "6 ^ 6 ^ 6" 0.184s লাগে সুতরাং সিসি 7x গতিবেগ সত্ত্বেও খ্রিস্টের বিস্ফোরকতা পাইথনের তুলনায় 4x এর চেয়ে ধীরে ধীরে।


4
আপনি সেখানে সীসা কবর দিয়েছিলেন। আপনি শেষের বিটটিকে শীর্ষে স্থানান্তর করতে চাইতে পারেন।
Riking

শুধু আমার মেশিনে সুদ থেকে বের: সময় পাইথন -c 'পাস' 0m0.025s, সময় পাইথন -c '6 প্রিন্ট 6 0m0.087s কিন্তু সময় পাইথন -c' এক্স = 6 6 ' 6 6' 0m0.028s তাই সবচেয়ে এর সময়টি বিশাল সংখ্যাকে আউটপুট করে চলেছে।
স্টিভ বার্নেস

হ্যাঁ, বেস 10 এ রূপান্তর করতে অঙ্কের সংখ্যায় চতুর্ভুজ সময় লাগে। চরম ঘটনা হিসাবে, বৃহত্তর মার্সেন প্রাইমগুলির মধ্যে একটি মুদ্রণের চেষ্টা করুন। এটি গণনা করা খুব দ্রুত, তবে বেস 10 এ মুদ্রণ করতে অনেক সময় নেয়
অ্যান্ড্রু ডাল্ক

11

আমি বিভিন্ন ক্ষেত্রের ব্যাখ্যা করে এসওতে একটি দুর্দান্ত উত্তর পেয়েছি :

  • রিয়েল হ'ল দেয়ালের ঘড়ির সময় - কলটি শুরু থেকে শেষের সময়। এটি অন্যান্য প্রসেস দ্বারা ব্যবহৃত সময় স্লাইস এবং প্রক্রিয়াটি অবরুদ্ধ করার সময় ব্যয় করার সময় সহ সমস্ত অতিবাহিত সময় (উদাহরণস্বরূপ যদি এটি I / O সম্পূর্ণ হওয়ার অপেক্ষায় থাকে)।

  • প্রক্রিয়াটির মধ্যে ব্যবহারকারী-মোড কোডে (কার্নেলের বাইরে) সিপিইউ সময় ব্যয় করা হয় User প্রক্রিয়াটি কার্যকর করতে এটি কেবল আসল সিপিইউ সময়। অন্যান্য প্রক্রিয়া এবং প্রক্রিয়া অবরুদ্ধ সময় ব্যয় করে এই চিত্রের দিকে গণনা করা হয় না।

  • প্রক্রিয়াটির মধ্যে কার্নেলের জন্য সিপিইউর সময় ব্যয় করা হয় সিস। এর অর্থ কার্নেলের মধ্যে সিস্টেম কলগুলিতে ব্যয় করা সিপিইউ সময় কার্যকর করা, লাইব্রেরি কোডের বিপরীতে, যা এখনও ব্যবহারকারী-স্পেসে চলছে। 'ব্যবহারকারী' এর মতো, এটি কেবলমাত্র প্রক্রিয়া দ্বারা ব্যবহৃত সিপিইউ সময়। কার্নেল মোড ('সুপারভাইজার' মোড হিসাবে পরিচিত) এবং সিস্টেম কল প্রক্রিয়া সম্পর্কে একটি সংক্ষিপ্ত বিবরণ জন্য নীচে দেখুন।

সুতরাং, আপনার নির্দিষ্ট উদাহরণে, পাইথন সংস্করণটি সম্পূর্ণ হতে সময় লাগে তার নিরিখে দ্রুত। যাইহোক, পাইথন পদ্ধতির কার্নেল-স্পেসে বেশি সময় ব্যয় করে কার্নেল ফাংশনগুলিতে কল করা যায়। bcকমান্ড কার্নেল স্থান মূলত কোন সময় ব্যয় করে এবং সব সময় ইউজার-স্পেসের মধ্যে ব্যয় করা হয় সম্ভবতঃ অভ্যন্তরীণ চলমান bcকোড।

এটি আপনাকে কোনও realতাত্পর্যপূর্ণ করে না, কেবলমাত্র যে তথ্যগুলি আপনি সত্যই যত্নবান তা হ'ল কমান্ডটি আরম্ভ করার এবং এটির আউটপুট পাওয়ার মধ্যবর্তী সময়টিই আসল সময়।

আপনার এই সচেতন হওয়া উচিত যে এই ক্ষুদ্র পার্থক্যগুলি স্থিতিশীল নয়, তারা আপনার সিস্টেমের বোঝার উপরও নির্ভর করবে এবং আপনি যখনই আদেশটি চালাবেন ততবার পরিবর্তন হবে:

$ for i in {1..10}; do ( time python test.py > /dev/null ) 2>&1; done | grep user
user    0m0.056s
user    0m0.052s
user    0m0.052s
user    0m0.052s
user    0m0.060s
user    0m0.052s
user    0m0.052s
user    0m0.056s
user    0m0.048s
user    0m0.056s

$ for i in {1..10}; do ( time echo 6^6^6 | bc > /dev/null ) 2>&1; done | grep user
user    0m0.188s
user    0m0.188s
user    0m0.176s
user    0m0.176s
user    0m0.172s
user    0m0.176s
user    0m0.180s
user    0m0.172s
user    0m0.172s
user    0m0.172s

10

আমি এটি অন্য দৃষ্টিকোণ থেকে ব্যাখ্যা করব।

ন্যায়সঙ্গত হওয়ার জন্য, bcসুবিধা রয়েছে কারণ এটি ডিস্ক থেকে কোনও কিছু পড়তে হয় না এবং কেবল তার ব্লব / বাইনারিগুলির প্রয়োজন হয় যখন পাইথনকে একটি সিরিজ মডিউল + একটি ফাইল পড়ার জন্য আমদানি করতে হয়। সুতরাং আপনার পরীক্ষা হতে পারে পক্ষপাতদুষ্ট bc। আসলে এটি পরীক্ষা করতে আপনার bc -q fileযেখানে ব্যবহার করা উচিত তা ব্যবহার করা উচিত file:

6^6^6
quit

পরিবর্তনের জন্য কেবল এটির সময় পরিবর্তিত হয়েছে echo:

bc  0.33s user 0.00s system 80% cpu 0.414 total

ফাইলটি ব্যবহার করতে:

bc -q some  0.33s user 0.00s system 86% cpu 0.385 total

(বৃহত্তর পার্থক্য লক্ষ্য করার জন্য আপনাকে টেরডনের পদ্ধতিটি ব্যবহার করতে হবে, তবে কমপক্ষে আমরা জানি তারা হ'ল)

এখন, অজগর দৃষ্টিকোণ থেকে, পাইথনকে ডিস্ক থেকে পড়তে হবে, প্রতিবার ফাইলটি সংকলন সম্পাদন করতে হবে, সাথে সাথে অ্যান্ড্রু পয়েন্ট হিসাবে লোডিং মডিউলগুলি কার্যকর করা সময়কে ধীর করে দেয়। যদি আপনি পাইথন স্ক্রিপ্টের বাইট কোডটি সংকলন করেন তবে আপনি খেয়াল করবেন যে কোডটি চালাতে মোট 50% কম সময় লাগে:

python some.py > /dev/null  0.25s user 0.01s system 63% cpu 0.413 total

সংকলিত:

./some.pyc  0.22s user 0.00s system 77% cpu 0.282 total

আপনি দেখতে পাচ্ছেন, বেশ কয়েকটি কারণ রয়েছে যা বিভিন্ন সরঞ্জামের মধ্যে সময় নির্বাহকে প্রভাবিত করতে পারে।


3

আমি অন্যান্য উত্তর পড়ার সুবিধা পেয়েছি। জন্য আমার মত নতুনদের মানুষ কারণ জানা উচিত কেন আমরা এত বড় পূর্ণসংখ্যা এখানে সাথে এসেছেন ডিলিং যে উভয় Pythonএবং bcনা ডান-মিশুক , exponentiation সম্প্রসারণ যার মানে এই নয় 6^36আমরা মূল্যায়ন করছেন বরং 6^46656যা যথেষ্ট বড়। 1

নিম্নলিখিত কমান্ডগুলির বিভিন্নতা ব্যবহার করে, আমরা timeসংরক্ষিত শব্দ এবং কমান্ড উভয়ের আউটপুটটির একটি নির্দিষ্ট উপাদানের জন্য গড় উত্তোলন করতে পারি :

for i in {1..1000}; do (time echo 6^6^6 | bc > /dev/null) 2>&1; done | grep 'rea' | sed -e s/.*m// | awk '{sum += $1} END {print sum / NR}'

for i in {1..1000}; do (/usr/bin/time -v sh -c 'echo 6^6^6 | bc > /dev/null') 2>&1; done | grep 'Use' | sed -e s/.*:// | awk '{sum += $1} END {print sum / NR}'

তুলনা থেকে পুরোপুরি অপসারণ করা অন্য রুটে যাওয়া এবং ফাইলটিকে সরিয়ে ফেলা সম্ভব। এছাড়াও, আমরা ভালো কিছু সঙ্গে বিসি এর সময়জ্ঞান তুলনা করতে পারবেন dcকমান্ড, যেমন ঐতিহাসিকভাবে সাবেক একটি "সামনে শেষ প্রসেসর" আধুনিক হয়। নিম্নলিখিত কমান্ডগুলির সময়সীমা নির্ধারণ করা হয়েছিল:

echo 6^6^6 | bc
echo 6 6 6 ^ ^ p | dc
echo print 6**6**6 | python2.7

খেয়াল করুন dcকমান্ডটি ক্ষয়ের জন্য বাম-সহযোগী is 2

আমাদের time1000 টি পুনরাবৃত্তির (সেকেন্ডে) জন্য (বাশ) কিছু ফলাফল রয়েছে :

0.229678 real bc
0.228348 user bc
0.000569 sys bc
0.23306  real dc
0.231786 user dc
0.000395 sys dc
0.07 real python
0.065907 user python
0.003141 sys python

bcএবং dcএই প্রসঙ্গে তুলনামূলক কর্মক্ষমতা অফার।

জিএনইউ কমান্ডের থেকে কম নির্ভুল 3 ফলাফল (স্কেল যথার্থতা এখানে বৈধ নয় তবে ফলাফলগুলি একই রকম):/usr/bin/timetime

0.2224 user bc
0 sys bc
0.23 Elapsed bc
0.22998 user dc
0 sys dc
0.23 Elapsed dc
0.06008 user python
0 sys python
0.07 Elapsed python

এর একটি সুবিধা /usr/bin/timeহ'ল এটি -vবিকল্পটি সরবরাহ করে যা অনেক বেশি তথ্য দেয় যা শেষ পর্যন্ত কার্যকর হতে পারে।

পাইথন মডিউলটির সাথে কথা বলার জন্য অভ্যন্তরীণভাবে এটি মূল্যায়ন করাও সম্ভব timeit:

python2.7 -m timeit -n 1000 -r 1 'print 6**6**6' | grep 'loops'
1000 loops, best of 1: 55.4 msec per loop

আমরা এর আগে যা দেখেছি তার থেকে কিছুটা দ্রুত। দোভাষী নিজেই চেষ্টা করে দেখুন:

>>> import timeit
>>> import sys
>>> import os
>>> T = timeit.Timer("print 6**6**6")
>>> n = int(1000)
>>> f = open(os.devnull, 'w')
>>> sys.stdout = f
>>> t = t.timeit(n)
>>> sys.stdout = sys.__stdout__
>>> print t/n
0.0553743481636

এটাই আমি দেখেছি দ্রুততম।


আমরা যদি এর চেয়ে কম ক্ষুদ্রতর মূল্যায়ন মূল্যায়ন করি 6^6তবে টাইম কমান্ডটি বিস্ময়কর ফলাফল দেয় - একই forলুপ কমান্ড ব্যবহার করে আমাদের এখন রয়েছে:

0.001001 bc real
0.000304 user
0.000554 sys
0.014    python real i.e. 10x more than bc??
0.010432 user
0.002606 sys

একটি ছোট পূর্ণসংখ্যা সঙ্গে bcহঠাৎ হঠাৎ অনেক দ্রুত ?? সিস্টেম পুনরায় বুট থেকে দ্বিতীয় রান পর্যন্ত কোনও তফাত হয় না। তবুও একই সময়ে, আমরা timeitপাইথনের জন্য ব্যবহার করলে , আমরা পাই:

python2.7 -m timeit -n 100000 -r 1 'print 6**6' | grep loops  
100000 loops, best of 1: 0.468 usec per loop

এটি মাইক্রোসেকেন্ডস , মিলিসেকেন্ড নয়, তাই forলুপটি ব্যবহার করে খুব ধীর ফলাফলের সাথে এটি মেলে না । এটিকে আরও পরীক্ষা করার জন্য অন্যান্য সরঞ্জামগুলির প্রয়োজন হতে পারে এবং অন্যরা যেমন এখানে বর্ণিত চোখের চেয়ে আরও বেশি কিছু ব্যাখ্যা করেছে। দেখে মনে হচ্ছে প্রশ্নের দৃশ্যে পাইথন দ্রুত ছিল তবে এটি পরিষ্কার নয় যে এর বাইরেও কোন সিদ্ধান্ত নেওয়া যায় ...


1. এটি ইকো-এর পাটিগণিতের সম্প্রসারণের মতো কোনও কিছুর আওতার বাইরে বলা বাহুল্য echo $((6**6**6))- অর্থাত্ এটির bashজন্য ডান-অ্যাসোসিয়েটিভও ঘটে 6^6^6 = 6^(6^6)

2. এই সঙ্গে তুলনা করুন: 6 6 ^ 6 ^ p

৩. বিএসডি ইউনিক্স (জিএনইউ সময় তথ্য নথি) চালানোর সময় জিএনইউ টাইম কমান্ড আরও তথ্য সরবরাহ করতে পারে: 'সময়' দ্বারা প্রদর্শিত বেশিরভাগ তথ্য 'ওয়েট 3' সিস্টেম কল থেকে প্রাপ্ত। সংখ্যাগুলি কেবল 'ওয়েট 3' দিয়ে ফিরে আসার মতোই ভাল। 'সিস্টেম' যে সমস্ত সংস্থাগুলি 'সময়' প্রতিবেদন করতে পারে সেগুলির অনেকগুলি সিস্টেম পরিমাপ করে না; এই সংস্থানগুলি শূন্য হিসাবে রিপোর্ট করা হয়েছে। যে সমস্ত সিস্টেমে সর্বাধিক বা সমস্ত সংস্থান পরিমাপ করা হয় সেগুলি 4.2 বা 4.3BSD এর উপর ভিত্তি করে। পরে বিএসডি প্রকাশে বিভিন্ন মেমরি পরিচালন কোড ব্যবহার করা হয় যা কম সংস্থার পরিমাপ করে। - যেসব সিস্টেমে 'অপেক্ষা3' কল নেই যা স্থিতির তথ্য ফেরত দেয়, পরিবর্তে 'সময়' সিস্টেম কলটি ব্যবহৃত হয়। এটি 'অপেক্ষা3' এর চেয়ে অনেক কম তথ্য সরবরাহ করে, সুতরাং সেই সিস্টেমে 'সময়' বেশিরভাগ সংস্থানকে শূন্য হিসাবে প্রতিবেদন করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.