Tag: python internals

Что делает списки неумелыми?

Таким образом, списки расстегиваются: >>> { [1,2]:3 } TypeError: unhashable type: 'list' Следующая страница дает объяснение: Список является изменяемым типом и не может использоваться в качестве ключа в словаре (он может изменить на месте, делая ключ больше не локализуемым во внутренней хеш-таблице словаря). Я понимаю, почему нежелательно использовать изменяемые объекты в качестве словарных ключей. Однако […]

Какие стандартные библиотечные модули необходимы для запуска интерпретатора Python 3.5?

Вот программа CPython, которая пытается инициализировать интерпретатор пустым sys.path : #include <Python.h> int main(int argc, char** argv) { wchar_t* program = NULL; wchar_t* sys_path = NULL; Py_NoSiteFlag = 1; program = Py_DecodeLocale(argv[0], NULL); Py_SetProgramName(program); sys_path = Py_DecodeLocale("", NULL); Py_SetPath(sys_path); Py_Initialize(); PyMem_RawFree(program); PyMem_RawFree(sys_path); Py_Finalize(); } Выполнение вышеуказанной программы вызывает следующую ошибку: Fatal Python error: Py_Initialize: Unable […]

Использует ли cPython несколько ядер для встроенных функций, таких как sort, any, all?

Я понимаю, что cPython имеет GIL, так что ваш скрипт не может работать на нескольких ядрах без использования модуля многопроцессорности. Но есть ли что-нибудь, чтобы остановить встроенные функции, такие как сортировка с использованием нескольких ядер? Я не понимаю структуру cPython, но я думаю, что вопрос, который я задаю, это «встроенные функции, такие как сортировка, какие-либо […]

Почему выражения генератора и определения dict / set в Python 2 используют вложенную функцию в отличие от понимания списков?

В списках понимается, что их код помещается непосредственно в функцию, в которой они используются, например: >>> dis.dis((lambda: [a for b in c])) 1 0 BUILD_LIST 0 3 LOAD_GLOBAL 0 (c) 6 GET_ITER >> 7 FOR_ITER 12 (to 22) 10 STORE_FAST 0 (b) 13 LOAD_GLOBAL 1 (a) 16 LIST_APPEND 2 19 JUMP_ABSOLUTE 7 >> 22 RETURN_VALUE […]

Почему max (iterable) работает намного медленнее, чем эквивалентный цикл?

Я заметил странный удар производительности от мелкого рефакторинга, который заменил цикл вызовом встроенного max внутри рекурсивной функции. Вот простейшее воспроизведение, которое я мог бы произвести: import time def f1(n): if n <= 1: return 1 best = 0 for k in (1, 2): current = f1(nk)*n if current > best: best = current return best […]

Как работает __call__?

Волшебный метод Python __call__ вызывается всякий раз, когда вы __call__ вызвать объект. Cls()() , таким образом, равен Cls.__call__(Cls()) . Функции – это объекты первого класса в Python, то есть они просто вызываемые объекты (с использованием __call__ ). Однако сама __call__ является функцией, поэтому она также имеет __call__ , которая снова имеет свой собственный __call__ , […]

Индексы фрагментов ограничены 0x7FFFFFFF

Я играю с кусочками в Python (2.7.4): class Foo(): def __getitem__(self, key): # Single value if isinstance(key, (int,long)): return key # Slice if isinstance(key, slice): print 'key.start = 0x{0:X} key.stop = 0x{1:X}'.format(key.start, key.stop) length = key.stop – key.start return str(length) Кажется, все работает так, как ожидалось: >>> f = Foo() >>> >>> f[42] 42 >>> […]

Почему экземпляры экземпляров старого стиля класса «объект»?

В Python 2, почему экземпляры старых классов стиля все еще являются экземплярами object даже если они явно не наследуют object ? class OldClass: pass >>> isinstance(OldClass(), object) True Прежде чем тестировать это, я бы сделал вывод, что isinstance(x, object) == True будет означать, что x является экземпляром подкласса object и, следовательно, экземпляром нового класса стилей, […]

В чем причина переменной _secret_backdoor_key в исходном коде библиотеки Python HMAC?

Когда я просматривал исходный код модуля Python HMAC сегодня, я обнаружил, что он содержит глобальную переменную _secret_backdoor_key . Затем эта переменная проверяется на прерывание инициализации объекта. Код выглядит так: # A unique object passed by HMAC.copy() to the HMAC constructor, in order # that the latter return very quickly. HMAC("") in contrast is quite # […]

Строки Python неизменяемы, поэтому почему s.split () возвращает список новых строк

CPython реализацию CPython кажется, что возвращаемое значение строки split() представляет собой список недавно выделенных строк. Однако, поскольку строки являются неизменными, кажется, что можно было сделать подстроки из исходной строки, указав на смещения. Я правильно понимаю текущее поведение CPython? Есть ли причины для отказа от этой оптимизации пространства? Одна из причин, о которой я могу думать, […]

Python - лучший язык программирования в мире.