পাইথনে ব্যতিক্রম হ্যান্ডলারের ব্যয়


99

ইন আরেকটি প্রশ্ন , গৃহীত উত্তর যদি বিবৃতি / অবরুদ্ধ ব্যতীত পারফরম্যান্সের উন্নতি করতে ব্যবহার করে দেখুন সঙ্গে পাইথন কোডে প্রতিস্থাপন একটি (খুব সস্তা) সুপারিশ করেছে।

কোডিং শৈলীর বিষয়গুলি একপাশে রেখে, এবং ধরে নেওয়া যে ব্যতিক্রমটি কখনই ট্রিগার হয় না, ব্যতিক্রম হ্যান্ডলারটি (পারফরম্যান্স-ওয়াইজ) কতটা পার্থক্য করে, একটি না করে বনাম, তুলনা-শূন্যকে যদি বিবৃতি দেয়?


6
আপনি যখন এটি পরিমাপ করলেন, আপনি কী শিখলেন?
এসলট

4
সংশ্লিষ্ট প্রশ্ন: stackoverflow.com/questions/1835756
tzot

অংশটি বাদে নিয়ন্ত্রণের সম্ভাবনা কম এবং / যদি যদি সম্ভাবনা বেশি থাকে তবে চেষ্টা করুন / বাদে ব্যবহার করুন।
छाया0359

উত্তর:


115

আপনি timeitমডিউলটি ব্যবহার করে এটি পরিমাপ করবেন না কেন ? এটি আপনার আবেদনের সাথে প্রাসঙ্গিক কিনা তা আপনি দেখতে পারেন।

ঠিক আছে, সুতরাং আমি কেবল নিম্নলিখিতটি চেষ্টা করেছি:

import timeit

statements=["""\
try:
    b = 10/a
except ZeroDivisionError:
    pass""",
"""\
if a:
    b = 10/a""",
"b = 10/a"]

for a in (1,0):
    for s in statements:
        t = timeit.Timer(stmt=s, setup='a={}'.format(a))
        print("a = {}\n{}".format(a,s))
        print("%.2f usec/pass\n" % (1000000 * t.timeit(number=100000)/100000))

ফলাফল:

a = 1
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.25 usec/pass

a = 1
if a:
    b = 10/a
0.29 usec/pass

a = 1
b = 10/a
0.22 usec/pass

a = 0
try:
    b = 10/a
except ZeroDivisionError:
    pass
0.57 usec/pass

a = 0
if a:
    b = 10/a
0.04 usec/pass

a = 0
b = 10/a
ZeroDivisionError: int division or modulo by zero

সুতরাং, যেমনটি প্রত্যাশা করা হয়েছে, কোনও ব্যতিক্রম হ্যান্ডলার না থাকা কিছুটা দ্রুত (তবে ব্যতিক্রম ঘটলে আপনার মুখে ফুঁক দেয়), এবং যতক্ষণ শর্তটি পূরণ না হয় ততক্ষণ try/exceptস্পষ্টের চেয়ে দ্রুত ifis

তবে এটি সমস্ত মাত্রার একই ক্রমের মধ্যে এবং কোনওভাবেই এটির সম্ভাবনা কম। কেবলমাত্র শর্তটি পূরণ করা হলে ifসংস্করণটি উল্লেখযোগ্যভাবে দ্রুত হয়।


4
মজাদার. এর try/exceptচেয়ে দ্রুতif a != 0
থাইলো

12
আহ, শব্দের একটি দুর্দান্ত পছন্দ: "এগুলি সমস্তই একই মাত্রার ক্রমের মধ্যে রয়েছে" ... আমি সন্দেহ করি যে ব্যতিক্রমগুলি এড়িয়ে চলেন এমন অনেক লোক তাদের ধীরে ধীরে 10x হওয়ার প্রত্যাশা করে।
গ্যারেট ব্লুমা

অজগর ২. p.৫ সহ আমার ফেডোরায় আপনার কোড চালানো বোঝায় যে "যদি" সংস্করণ (0.08 ইউজেক / পাস) "= চেষ্টা করুন" ব্যতীত "(0.11 ইউজেক / পাস) এর চেয়ে দ্রুত হয় যখন a = 1 হয়।
দুলেশি

পছন্দ করুন আমি ভাবছি এটি কোনও x86 / x64 জিনিস কিনা? বা সম্ভবত বিভিন্ন প্রসেসরের এক্সটেনশন?
বেসিক

60

এই প্রশ্নের উত্তরটি ডিজাইন এবং ইতিহাসের FAQ এ আসলে দেওয়া হয়েছে :

যদি কোনও ব্যতিক্রম না উত্থাপন করা হয় তবে চেষ্টা করুন / ব্লক ব্যতীত অত্যন্ত কার্যকর। আসলে একটি ব্যতিক্রম ধরা ব্যয়বহুল।


4
আমি কেবল ভাবছিলাম "অত্যন্ত দক্ষ" কতটা দক্ষ efficient স্পষ্টতই এটি দ্রুত তবে খুব সাধারণ "যদি" বিবৃতিটিও।
থিলো

আপনার পোস্ট করা অংশগুলি হ'ল ডিজাইন এবং ইতিহাস এফএকিউ
নিতাস

হতে পারে "চূড়ান্ত দক্ষ" মানে জাভাতে কি করা হয় তার মতো কিছু ?
ebk

19

এই প্রশ্নটি বিভ্রান্তিকর। আপনি যদি ধরে নেন যে ব্যতিক্রমটি কখনই ট্রিগার হয় না, কোনওটিই অনুকূল কোড নয়।

যদি আপনি ধরে নেন যে ব্যতিক্রমটি একটি ত্রুটি শর্তের অংশ হিসাবে ট্রিগার হয়েছে, আপনি ইতিমধ্যে অনুকূল কোড চাওয়ার ক্ষেত্রের বাইরে রয়েছেন (এবং আপনি সম্ভবত এটির মতো সূক্ষ্ম স্তরে পরিচালনা করছেন না)।

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

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