ব্যাকটিকস অজগর দোভাষী এর অর্থ কী: `সংখ্যা`


89

আমি তালিকা বোধগম্যতা নিয়ে ঘুরে বেড়াচ্ছি এবং আমি অন্য সাইটে এই ছোট্ট স্নিপেটটি পেরিয়ে এসেছি:

return ''.join([`num` for num in xrange(loop_count)])

আমি কিছু মিনিট সময়টি বুঝতে পেরে ফাংশনটি (টাইপ করে) প্রতিলিপি করার চেষ্টা করেছিলাম `num`কিছুটা ব্রেক হয়ে গেছে।

এই চরিত্রগুলিতে একটি বিবৃতি আবদ্ধ করা কি করে? যা আমি দেখতে পাচ্ছি তা হ'ল str (num) এর সমতুল্য। তবে আমি যখন এটির সময়সাপেক্ষ করেছি:

return ''.join([str(num) for num in xrange(10000000)])

এটি 4.09s সময় নেয় যদিও:

return ''.join([`num` for num in xrange(10000000)])

2.43s লাগে।

উভয়ই অভিন্ন ফলাফল দেয় তবে একটি অনেক ধীর। এখানে কি হচ্ছে?

সম্পাদনা: অদ্ভুতভাবে ... এর repr()চেয়ে কিছুটা ধীর ফলাফল দেয় `num`। 2.99s বনাম 2.43s। পাইথন ২.6 ব্যবহার করে (এখনও 3.0 চেষ্টা করেনি)।


8
স্কাইমাইন্ড . com / indocrow / python_string এ "অন্য সাইট" পড়ার পরে , আমারও অনুরূপ প্রশ্ন হয়েছিল এবং এই পৃষ্ঠাটি পেয়েছি। সুন্দর প্রশ্ন এবং চমৎকার উত্তর :)
নেটভোপ

উত্তর:


124

ব্যাকটিক্স হ'ল একটি অবহেলিত ওরফে repr()। এগুলি আর ব্যবহার করবেন না, সিনট্যাক্সটি পাইথন 3.0.০ এ সরানো হয়েছে।

ব্যাকটিক্স ব্যবহার করা 2.X সংস্করণ ব্যবহার করা repr(num)বা তার চেয়ে দ্রুত বলে মনে হচ্ছে num.__repr__()আমার ধারণা এটি কারণ কারণ অতিরিক্ত অভিধানের অনুসন্ধান যথাক্রমে গ্লোবাল নেমস্পেসে ( reprবা জন্য ) বা অবজেক্টের নেমস্পেসে (জন্য __repr__) প্রয়োজন।


disমডিউলটি ব্যবহার করা আমার অনুমানকে প্রমাণ করে:

def f1(a):
    return repr(a)

def f2(a):
    return a.__repr__()

def f3(a):
    return `a`

ডিসসেম্বলিং শো:

>>> import dis
>>> dis.dis(f1)
  3           0 LOAD_GLOBAL              0 (repr)
              3 LOAD_FAST                0 (a)
              6 CALL_FUNCTION            1
              9 RETURN_VALUE
>>> dis.dis(f2)
  6           0 LOAD_FAST                0 (a)
              3 LOAD_ATTR                0 (__repr__)
              6 CALL_FUNCTION            0
              9 RETURN_VALUE        
>>> dis.dis(f3)
  9           0 LOAD_FAST                0 (a)
              3 UNARY_CONVERT       
              4 RETURN_VALUE   

f1এর জন্য একটি বিশ্বব্যাপী অনুসন্ধান অন্তর্ভুক্ত রয়েছে repr, এর জন্য f2একটি অ্যাট্রিবিউট লুকআপ __repr__, অন্যদিকে ব্যাকটিক অপারেটরটি একটি পৃথক অপকোডে প্রয়োগ করা হয়। যেহেতু অভিধান দেখার জন্য কোনও ওভারহেড নেই ( LOAD_GLOBAL/ LOAD_ATTR) বা ফাংশন কলগুলির জন্য CALL_FUNCTION) ( ) নেই, তাই ব্যাকটিকগুলি দ্রুত।

আমি অনুমান করি যে পাইথন লোকেরা সিদ্ধান্ত নিয়েছে যে এর জন্য পৃথক নিম্ন-স্তরের অপারেশন repr()করা উপযুক্ত নয় এবং উভয় repr()এবং ব্যাকটিক্স থাকা নীতি লঙ্ঘন করে

"এখানে একটি থাকা উচিত - এবং এটি করার পক্ষে কেবলমাত্র একটি - প্রকাশ্য উপায়"

তাই বৈশিষ্ট্যটি পাইথন 3.0 এ সরানো হয়েছে।


আমি জানতে চেয়েছিলাম, কীভাবে আপনি কিছু ফাংশন কল দিয়ে ব্যাকটিকগুলি প্রতিস্থাপন করতে পারেন, তবে মনে হয় এটি সম্ভব নয়, নাকি?
জিরি 11

4
ব্যাকটিক্সের পরিবর্তে repr () ব্যবহার করুন। ব্যাকটিকগুলি পুনরায় (come.০) আসার জন্য অবচিত সিনট্যাক্স হয়। আমি আসলে ব্যাকটিক্সের চেহারা পছন্দ করি বরং তার পরিবর্তে অন্য কোনও ফাংশন কল করি।
ডমিনিক বউ-সামরা

9
ব্যাকটিকগুলি অবমূল্যায়ন করার কারণটি `চরিত্রের কারণেই; এটি টাইপ করা শক্ত (কিছু কীবোর্ডে), এটি কী তা দেখতে শক্ত, পাইথনের বইগুলিতে সঠিকভাবে মুদ্রণ করা শক্ত। ইত্যাদি
u0b34a0f6ae

4
@ কাইজার.সেস: এটি নির্দেশ করার জন্য ধন্যবাদ। সম্ভবত ব্যাকটিক্স বাদ দেওয়ার মূল কারণ, মেইলিং তালিকার সংরক্ষণাগারগুলিতে গিডোস বিবৃতি দেখুন: mail.python.org/pipermail/python-ideas/2007-
ফার্ডিনান্দ বায়ার

এটির মূল প্রশ্নটি পোস্ট করা হয়েছিল কারণ আমি আমার কীবোর্ডে ব্যাকটিক্সটি আসলে খুঁজে পাইনি;) টিলডের নীচে এটি গুগল করার পরে মনে হয়।
ডমিনিক বউ-সামরা

10

ব্যাকটিক উদ্ধৃতি সাধারণত অ কাজে লাগে এবং পাইথন 3 এ যায়।

এটি মূল্যবান জন্য কি:

''.join(map(repr, xrange(10000000)))

আমার জন্য ব্যাকটিক সংস্করণ তুলনায় সামান্য দ্রুত। তবে এটি নিয়ে চিন্তিত হওয়া সম্ভবত একটি অকালিক অনুকূলতা।


4
কেন এক ধাপ পিছনে যান এবং তালিকা / পুনরুক্তি বোঝার পরিবর্তে মানচিত্রটি ব্যবহার করবেন?
নিকো

4
আসলে, এর চেয়ে timeitদ্রুত ফলাফল দেয় (এর ''.join(map(repr, xrange(0, 1000000)))জন্য ''.join([repr(i) for i in xrange(0, 1000000)])আরও খারাপ ''.join( (repr(i) for i in xrange(0, 1000000)) ))। এটি কিছুটা হতাশার ;-)
রেডগ্লাইফ

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

7
না হয় অবাক হয় না, তালিকা অনুধাবনের খ্যাতি (এই উদাহরণে 30% হিট দিয়ে) এটি খুব খারাপ with তবে আমি বরং জ্বলন-গতির কোডের চেয়ে স্পষ্ট চাই যদি না এটি সত্যিই গুরুত্বপূর্ণ হয়, সুতরাং এখানে কোনও বড় চুক্তি নেই। বলা হচ্ছে, মানচিত্র () ফাংশনটি আমাকে অস্পষ্ট হিসাবে আঘাত করে না, কখনও কখনও এলসি ওভাররেটেড হয়।
রেডগ্লাইফ

4
mapআমার কাছে পুরোপুরি পরিষ্কার এবং সংক্ষিপ্ত বলে মনে হচ্ছে এবং আমি পাইথনকেও জানি না।
জেনেক্সার

1

আমার অনুমান যে numপদ্ধতিটি সংজ্ঞায়িত করে না __str__(), তাই str()এর জন্য দ্বিতীয় সন্ধানও করতে হবে __repr__

ব্যাকটিকগুলি সরাসরি অনুসন্ধান করে __repr__। যদি এটি সত্য হয়, তবে repr()ব্যাকটিকগুলির পরিবর্তে ব্যবহার করা আপনাকে একই ফলাফল দেয়।

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