পাইথনে কোনও বস্তুর বর্তমান রেফ গণনা পাওয়ার কোনও উপায় আছে কি?


93

পাইথনে কোনও বস্তুর বর্তমান রেফ গণনা পাওয়ার কোনও উপায় আছে কি?

উত্তর:


109

পাইথন মতে ডকুমেন্টেশন , sysমডিউল একটি ফাংশন রয়েছে:

import sys
sys.getrefcount(object) #-- Returns the reference count of the object.

অবজেক্ট আরগ টেম্প রেফারেন্সের কারণে সাধারণত আপনি প্রত্যাশার চেয়ে 1 টি বেশি।


অফিসিয়াল ডকুমেন্টেশনের লিঙ্ক: docs.python.org/2/library/sys.html#sys.getrefcount
moi

64

gcমডিউলটি, আবর্জনা সংগ্রহকারী সাহসের সাথে ইন্টারফেস ব্যবহার করে , আপনি gc.get_referrers(foo)যা উল্লেখ করছেন তার একটি তালিকা পেতে কল করতে পারেন foo

সুতরাং, len(gc.get_referrers(foo))আপনাকে সেই তালিকার দৈর্ঘ্য দেবে: রেফারার সংখ্যা, যা আপনার পরে রয়েছে।

আরও দেখুন gcমডিউল ডকুমেন্টেশন


7
এটিও উল্লেখ করা উচিত যে গণনাটি +1 হবে, যেহেতু সিসি তালিকাটি বস্তুকেও বোঝায়।
রিচার্ড লেভাসিউর

4
আমি মনে করি @ ড্যান যে উত্তরটি সঠিক: >>> আমদানি জিসি >>> ক্লাস বার (): ... পাস ... >>> খ = বার () >>> লেন (gc.get_referrers (খ)) 1 >>> gc.get_referrers (খ) [{'বি': <__ প্রধান__. বার দৃষ্টান্ত 0x7f1f010d0e18> এ, 'বার': <বর্গ প্রধান। বার 0x7f1f010d6530>, ' বিল্টিনস ': <মডিউল ' বিল্টিন ' (বিল্ট- in)>, ' প্যাকেজ ': কিছুই নেই, 'গিসি': <মডিউল 'জিসি' (অন্তর্নির্মিত)>, ' নাম ': ' প্রধান ', ' ডক ': কিছুই নেই}]
হাভোক

4
@ তেহভানের উত্তর ( sys.getrefcount(object)) এর চেয়ে আরও সোজা len(gc.get_referrers(foo)), যদি আপনার কেবলমাত্র সংখ্যাটি প্রয়োজন হয়।
moi

অ্যান্ড্রয়েডের কিপিথন 3 এ এটি ভুল উত্তর দেয়। প্রত্যেকবার.
শিহাব শাহরিয়ার খান

9

আছে gc.get_referrers()এবং sys.getrefcount()। তবে, sys.getrefcount(X)traditionalতিহ্যবাহী রেফারেন্স গণনার উদ্দেশ্য কীভাবে কার্যকর হতে পারে তা দেখা একধরনের কাজ। বিবেচনা:

import sys

def function(X):
    sub_function(X)

def sub_function(X):
    sub_sub_function(X)

def sub_sub_function(X):
    print sys.getrefcount(X)

তারপরে function(SomeObject)'7'
sub_function(SomeObject)সরবরাহ করে, '5'
sub_sub_function(SomeObject)সরবরাহ করে, '3'
sys.getrefcount(SomeObject)সরবরাহ করে এবং '2' সরবরাহ করে।

অন্য কথায়: আপনি যদি ব্যবহার করেন তবে sys.getrefcount()আপনাকে অবশ্যই ফাংশন কল গভীরতা সম্পর্কে সচেতন হতে হবে। জন্য gc.get_referrers()এক রেফারার তালিকা ফিল্টার করতে পারে।

আমি "পরিবর্তনের উপর বিচ্ছিন্নতা", যেমন "অন্য কোথাও রেফারেন্স দিলে ক্লোন করুন" এর মতো উদ্দেশ্যে ম্যানুয়াল রেফারেন্স গণনা করার প্রস্তাব দেব ।


5
import ctypes

my_var = 'hello python'
my_var_address = id(my_var)

ctypes.c_long.from_address(my_var_address).value

সিটিপস আর্গুমেন্ট হিসাবে ভেরিয়েবলের ঠিকানা নেয়। Sys.getRefCount ওপরে সিটিপস ব্যবহার করার সুবিধা হ'ল ফলাফল থেকে আপনার 1 টি বিয়োগ করার দরকার নেই।


4
হাস্যকর হলেও এই পদ্ধতিটি ব্যবহার করা উচিত নয়: 1) কোডটি পড়ার সময় কেউ কী বুঝতে পারে তা 2) এটি সিপথনের বাস্তবায়নের বিবরণের উপর নির্ভর করে: আইডিটির ঠিকানা এবং একটি পাইওবজেক্টের সঠিক মেমরি লেআউট। প্রয়োজনে getrefcount () থেকে কেবল 1 টি স্তর করুন।
EAD
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.