سؤال

هل هناك ثعبان مكافئ لرموز الياقوت؟

  • إذا كان الأمر كذلك ، فما هو؟

  • إذا لم يكن الأمر كذلك ، فهل نحن عالقون في استخدامه سلاسل كخاصتنا مفاتيح في القواميس فقط؟

هل كانت مفيدة؟

المحلول

لا ، لا يحتوي بيثون على نوع رمز.

ومع ذلك ، يتم تدريب الحرفيات المتأخرة بشكل افتراضي ويمكن تدريب السلاسل الأخرى باستخدام intern وظيفة. لذا فإن استخدام الأسلاك الحرفية كمفاتيح في القواميس ليس أقل أداءً من استخدام الرموز في روبي.

نصائح أخرى

كما قال آخرون ، لا يوجد رمز في بيثون ، لكن السلاسل تعمل بشكل جيد.

لتجنب اقتباس السلاسل كمفاتيح ، استخدم بناء جملة Dict () Constructor:

d = dict(
    a = 1,
    b = 2,
    c = "Hello there",
    )

أيضا للمهتمين: الرموز في روبي عند استخدامها في التجزئة تشبه إلى حد كبير الكائنات الفارغة في بيثون. على سبيل المثال يمكنك القيام به:

some_var = object()

ثم اضبط مفتاح القاموس على أنه Some_var:

some_dict = { some_var : 'some value' }

ثم قم بالاسترجاع القياسي:

some_dict[some_var]

ومع ذلك ، كما لاحظ Sepp2K أنه لا توجد فائدة أداء في القيام بذلك. في الواقع ، أجريت اختبارًا سريعًا ولاحظت القليل من الأداء:

a, b, c, d, e = [object() for _ in range(5)]
dict_symbols = {a : 'a', b : 'b', c : 'c', d : 'd', e : 'e'}
dict_strings = {'a' : 'a', 'b' : 'b', 'c' : 'c', 'd' : 'd', 'e' : 'e'}

def run_symbols():
    for key in dict_symbols.keys():
        dict_symbols[key]

def run_strings():
    for key in dict_strings.keys():
        dict_strings[key]

السرعة التي تم اختبارها في ipython:

In [3]: %timeit run_symbols
10000000 loops, best of 3: 33.2 ns per loop

In [4]: %timeit run_strings
10000000 loops, best of 3: 28.3 ns per loop

لذلك في حالتي ، تشغيل "الرموز" أبطأ! (للحصول على أرقام ممتعة ، غير دقيقة). ومع ذلك ، تجدر الإشارة إلى أنه من المحتمل أن تكون هناك مزايا للذاكرة للقيام بذلك بهذه الطريقة. إذا كنت لا تهتم بكائنات نوع المفاتيح لها بصمة أصغر من الأوتار.

import sys
sys.getsizeof('some_var') # 45
some_var = object() 
sys.getsizeof(some_var) # 0

على الرغم من أن هذا يثير مسألة كيفية تعامل بيثون لذاكرة الاسم المتغير some_var.

  1. لا ، لا يوجد ما يعادل.
  2. لا ، يمكنك استخدام كل كائن قابل للتجزئة كمفتاح قاموس.

ليس كنوع من الدرجة الأولى ولكن هناك https://pypi.python.org/pypi/Symboltype.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top