পাইথন বনাম জুলিয়া গতির তুলনা


10

আমি এই দুটি স্নিপেটের তুলনা করার চেষ্টা করেছি এবং দেখছি এক সেকেন্ডে কতগুলি পুনরাবৃত্তি করা যেতে পারে। দেখা যাচ্ছে যে জুলিয়া 2.5 মিলিয়ন আয়রণ অর্জন করে যেখানে পাইথন 4 মিলিয়ন। জুলিয়া কি দ্রুত হওয়ার কথা নয়? নাকি এই দুটি স্নিপেট সমান নয়?

পাইথন:

t1 = time.time()
i = 0
while True:
    i += 1
    if time.time() - t1 >= 1:
        break

জুলিয়া:

function f()
    i = 0
    t1 = now()
    while true
        i += 1
        if now() - t1 >= Base.Dates.Millisecond(1000)
            break
        end
    end
    return i
end

4
জুলিয়া কীভাবে কাজ করে তা আমি নিশ্চিত নই, তবে পাইথন সাধারণ পূর্ণসংখ্যার তুলনা করার সময় আপনাকে প্রতিটি তুলনার জন্য একটি নতুন অবজেক্ট তৈরি করতে হবে বলে মনে হয়।
চিপনার

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

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

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

1
আমি উভয় ভাষা ব্যবহার করি, এবং উভয়ই দ্রুত হওয়ার 'কিছু' উদাহরণ রয়েছে, তবে ভারসাম্যটি একদিকে যথেষ্ট। এটি কেবল পাইথনের ব্যাখ্যা এবং কঠোরভাবে পারফরম্যান্সের দিকে মনোনিবেশ করার ফলাফল যা অন্যদিকে জুলিয়ার পারফরম্যান্সের প্রতি দৃ focus় মনোনিবেশ রয়েছে। এটি আসলে অনেকটা বলার মতো যে পাইথন সি এর মতো দ্রুত It এটির মধ্যে খুব অদ্ভূত হবে যদি কোনও উল্লেখযোগ্য পার্থক্য না ঘটে এবং এটি জুলিয়ার উদ্দেশ্যকে অনেকাংশেই ক্ষুন্ন করে।
ডিএনএফ

উত্তর:


9

এটি একটি অদ্ভুত পারফরম্যান্স তুলনার ধরণ যেহেতু একটি নির্দিষ্ট পরিমাণে কেউ কতটা তুচ্ছ পুনরুক্তি করতে পারে তা দেখার চেয়ে সাধারণত পদার্থের কোনও কিছু গণনা করতে যে সময় লাগে তা পরিমাপ করে। আপনার পাইথন এবং জুলিয়া কোডগুলি কাজ করতে পেতে আমার সমস্যা হয়েছিল, তাই আমি জুলিয়া কোডটি কাজ করতে সংশোধন করেছি এবং পাইথন কোডটি চালাইনি। @ চেপনার একটি মন্তব্যে যেমন উল্লেখ করেছেন, অবজেক্টের 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()পরিবর্তে, যা আমি imaginatively ডাকব 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    

ওহো, শূন্য সেকেন্ড! কীভাবে সম্ভব? ঠিক আছে, এর তাকান এলএলভিএম কোডটি দেখুন (যেমন মেশিন কোডের মতো তবে একটি কাল্পনিক মেশিনের জন্য যা মধ্যবর্তী প্রতিনিধিত্ব হিসাবে ব্যবহৃত হয়) এটি এটিকে কমিয়ে দেয়:

julia> @code_llvm h()

;  @ REPL[16]:1 within `h'
define i64 @julia_h_293() {
top:
;  @ REPL[16]:6 within `h'
  ret i64 5000000050000000
}

সংকলকটি লুপটি দেখে, ফলাফলটি প্রতিবারের মতো একই চিত্রিত করে এবং কেবল লুপটি সঞ্চালনের পরিবর্তে স্থির মানটি দেয়। যা অবশ্যই শূন্য সময় নেয়।


এটা BogoMips প্রোগ্রামিং ভাষার
norok2

1
ডান, তবে বোগোমिपগুলি প্রোগ্রামিংয়ের ভাষা নয়, সিপিইউ পরিমাপ করতে ব্যবহৃত হয়। তবে নিশ্চিত, এটি এমন একটি জিনিস যা মাপতে পারে।
স্টিফানকার্পিনস্কি

4

আপনি সম্ভবত time_nsজুলিয়ায় ফাংশনটি ব্যবহার করতে চান :

function f()
    i = 0
    t1 = time_ns()
    while true
        i += 1
        if time_ns() - t1 >= 10^9
            break
        end
    end
    return i
end

আমার কম্পিউটারে এটি পাইথনের চেয়ে 10x দ্রুত চলে।


4

ঠিক আছে, আমি আমার সিস্টেমে এটি পর্যবেক্ষণ করি না:

পাইথন ৩.7..7

Python 3.7.7 (default, Mar 26 2020, 15:48:22) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.4.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import time                                                                                                                                                       

In [2]: def f(): 
   ...:     t1 = time.time() 
   ...:     i = 0 
   ...:     while True: 
   ...:         i += 1 
   ...:         if time.time() - t1 >= 1: 
   ...:             return i 
   ...:                                                                                                                                                                   

In [3]: f()                                                                                                                                                               
Out[3]: 4676268


জুলিয়া 1.4.0:

julia> using Dates

julia> function f()
           i = 0
           t1 = now()
           while true
               i += 1
               if now() - t1 >= Dates.Millisecond(1000)
                   break
               end
           end
           return i
       end
f (generic function with 1 method)

julia> f()
6339528

তবে মনে রাখবেন যে সহজভাবে ব্যবহার করা time(অর্থাত্ প্লেইন সংখ্যার তুলনা করা) আরও দ্রুত:

julia> function f()
           i = 0
           t1 = time()
           while true
               i += 1
               if time() - t1 >= 1
                   break
               end
           end
           return i
       end
f (generic function with 1 method)

julia> f()
24742703

time.perf_counter_ns()আপনি পাইথন ব্যবহার করবেন না?
norok2

Time.perf_counter_ns ব্যবহার করা এই বেঞ্চমার্কের জন্য কোনও কিছু (কমপক্ষে আমার সিস্টেমে) পরিবর্তন করে না। আমি অনুমান করি যে, 1 সেকেন্ডের ক্রমের সাথে সময়ের পার্থক্যগুলি পরিমাপ করার সময় সময় পরিমাপের যথার্থতা খুব বেশি গুরুত্বপূর্ণ নয়। পরিমাপ নিতে এবং ফলাফল প্রাপ্ত বস্তুগুলি এখানে তুলনা করতে কেবল সময় লাগে (পাশাপাশি লুপগুলি তাদের দক্ষতা হিসাবে)।
ফ্রান্সোয়েস ফ্যাভোত্তে

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