পাইথন - অ্যাবস বনাম চমকপ্রদ


107

আমি লক্ষ্য করেছি যে অজগরটিতে একটি সংখ্যার পরম মানের অনুসন্ধানের জন্য দুটি অনুরূপ চেহারা পদ্ধতি রয়েছে:

প্রথম

abs(-5)

দ্বিতীয়

import math
math.fabs(-5)

এই পদ্ধতিগুলির মধ্যে কীভাবে পার্থক্য রয়েছে?

উত্তর:


127

math.fabs()যদি এটি করতে পারে তবে তার যুক্তিটিকে ফ্লোটে রূপান্তরিত করে (যদি এটি না পারে তবে এটি একটি ব্যতিক্রম ছোঁড়ে)। এটি পরে নিখুঁত মান নেয় এবং ফলটিকে ভাসা হিসাবে ফিরিয়ে দেয়।

ভাসমান ছাড়াও, abs()পূর্ণসংখ্যা এবং জটিল সংখ্যাগুলির সাথেও কাজ করে। এটির রিটার্ন টাইপ তার যুক্তির ধরণের উপর নির্ভর করে।

In [7]: type(abs(-2))
Out[7]: int

In [8]: type(abs(-2.0))
Out[8]: float

In [9]: type(abs(3+4j))
Out[9]: float

In [10]: type(math.fabs(-2))
Out[10]: float

In [11]: type(math.fabs(-2.0))
Out[11]: float

In [12]: type(math.fabs(3+4j))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
/home/npe/<ipython-input-12-8368761369da> in <module>()
----> 1 type(math.fabs(3+4j))

TypeError: can't convert complex to float

4
absকেবলমাত্র পূর্ণসংখ্যা এবং ভাসমানের চেয়ে অনেক বেশি কাজ করে এবং ফলাফলের ধরনটি সর্বদা আর্গুমেন্টের মতো হয় না , যেমন abs(3+4j)
agf

1
fabsসর্বদা ভাসমান প্রকৃতির কারণে বেশি সময় নেওয়ার বিষয়ে একটি মন্তব্য যুক্ত করুন এবং আপনি সঠিক উত্তর পেয়েছেন!
প্যাট্রিক পেরিনি

@ এএফএফ: জটিল সংখ্যা সম্পর্কে আমাকে মনে করিয়ে দেওয়ার জন্য ধন্যবাদ Thanks আগ্রহের বাইরে, অন্য কোন শ্রেণিতে __builtin__.abs()কীভাবে সফলভাবে প্রয়োগ করা যেতে পারে?
এনপিই

5
@aix যেকোন ব্যবহারকারীর সংজ্ঞায়িত শ্রেণি যা __abs__যাদু পদ্ধতিটি সংজ্ঞায়িত করে
Agf

9

সম্পাদনা করুন: @ অয়েক্সের পরামর্শ অনুসারে, গতির পার্থক্যের তুলনা করার একটি আরও ভাল (আরও নিখুঁত) উপায়:

In [1]: %timeit abs(5)
10000000 loops, best of 3: 86.5 ns per loop

In [2]: from math import fabs

In [3]: %timeit fabs(5)
10000000 loops, best of 3: 115 ns per loop

In [4]: %timeit abs(-5)
10000000 loops, best of 3: 88.3 ns per loop

In [5]: %timeit fabs(-5)
10000000 loops, best of 3: 114 ns per loop

In [6]: %timeit abs(5.0)
10000000 loops, best of 3: 92.5 ns per loop

In [7]: %timeit fabs(5.0)
10000000 loops, best of 3: 93.2 ns per loop

In [8]: %timeit abs(-5.0)
10000000 loops, best of 3: 91.8 ns per loop

In [9]: %timeit fabs(-5.0)
10000000 loops, best of 3: 91 ns per loop

সুতরাং এটি পূর্ণসংখ্যার জন্য abs()কেবল সামান্য গতির সুবিধা বলে মনে হচ্ছে fabs()। ভাসমানদের জন্য abs()এবং fabs()অনুরূপ গতি প্রদর্শন করুন।


@ অয়েক্স যা বলেছে তা ছাড়াও, আরও একটি বিষয় বিবেচনার জন্য গতির পার্থক্য:

In [1]: %timeit abs(-5)
10000000 loops, best of 3: 102 ns per loop

In [2]: import math

In [3]: %timeit math.fabs(-5)
10000000 loops, best of 3: 194 ns per loop

তাই abs()দ্রুত চেয়ে math.fabs()


3
আপনি আপেলের সাথে আপেলের তুলনা করছেন না। from math import fabsনিশ্চিতভাবে ব্যবহার করুন -5.0এবং উভয়ের জন্য চেষ্টা করুন ।
agf

এছাড়াও অবিশ্বস্ত সময় ফলাফল? আপনার প্রথমে 102ns এ অ্যাবস (-5) ছিল, পরে এটি 88.3ns হিসাবে দেখান। অভ্যন্তরীণভাবে সময়সূচি যেমন সমস্যাগুলি এড়ানোর চেষ্টা করে এমনকি কোনও মানদণ্ডের একক রান থেকে কখনই সিদ্ধান্তে উঠবেন না।
পিটার হানসেন

1
আরও দুটি পয়েন্ট: এটি এখনও আপেল এবং কমলাগুলির সাথে তুলনা করে, যেহেতু অ্যাবসগুলি বিল্টিনগুলিতে সন্ধান করা হয়, যখন মাপগুলি মডিউল নেমস্পেসে থাকে। সেই প্রভাবটি সরাতে "xabs = অ্যাবস" এর পরে xabs (num) করুন। এছাড়াও, পাইথনের সাথে 3.2 জিনিসগুলি কিছুটা পরিবর্তন হয় এবং দৃশ্যত অ্যাবস () কমপক্ষে ফ্লোটে (> 2x) বেশ দ্রুত হয়।
পিটার হানসেন

1
@ পিটারহানসেন আপনি ঠিক বলেছেন, এটি দুটি সিস্টেম লোডের অধীনে দুটি রান থেকে। যদিও একই পরীক্ষার সেটগুলির মধ্যে তুলনা করা হয়, তবুও আপেক্ষিক পার্থক্যটি বৈধ। এছাড়াও, নেমস্পেসের পার্থক্যটি উল্লেখ করার জন্য ধন্যবাদ - আমি এটি বিবেচনা করি নি। আমি এটি 3.2 এ চেষ্টা করে দেখিনি, তবে এটি জেনে রাখা ভাল! আমি আপনার পরামর্শগুলির সাথে আমার উত্তরটি সামান্য পরে আপডেট করব :) আবার ধন্যবাদ!
কেজেড

3

math.fabs()সর্বদা ভাসা ফেরত দেয়, যখন abs()পূর্ণসংখ্যার ফিরে আসতে পারে।


6
absযে ধরণের নাম্বারটি __abs__আহ্বান করা হয়েছে তার বিশেষ পদ্ধতির উপর নির্ভর করে যে কোনও প্রকার ফেরত দিতে পারে ।
এজিএফ

0

abs(): আর্গুমেন্ট অনুসারে নিখুঁত মান প্রদান করে অর্থাত্ যদি যুক্তিটি int হয় তবে এটি পূর্বাবস্থায় ফিরে আসে, যদি যুক্তিটি ভাসমান হয় তবে এটি ভাসা ফেরত দেয়। এছাড়াও এটি জটিল ভেরিয়েবলের উপরও কাজ করে, abs(a+bj)এছাড়াও কাজ করে এবং পরম মানের অর্থ প্রদান করেmath.sqrt(((a)**2)+((b)**2)

math.fabs(): এটি কেবল পূর্ণসংখ্যা বা ভাসমান মানগুলিতে কাজ করে। আর্গুমেন্টের ধরন যাই হোক না কেন সর্বদা নিরঙ্কুশ ফ্লোট মান প্রদান করে (জটিল সংখ্যা ব্যতীত)।

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