LINUX.ORG.RU

Объектная модель питона

 , ,


2

4

- Сколько нужно архитекторов, чтобы создать язык программирования?
- Сто. Один будет писать язык, а 99 - говорить, что могут сделать лучше.

Так скажем, я решил вспомнить обсуждение по теме треда: Generics в Python или помогите победить mypy

Да, наркоманский питон захватывает мир, и с этим нужно что-то делать. Нет, я не намерен делать питон 4 - я вижу свет в конце тоннеля в рамках третьей версии. Но мне нужна ваша помощь: какие фундаментальные фичи, по-вашему, в питоне вообще не нужны, а какие - должны быть переработаны?

Прежде всего, я хотел бы вспомнить про RPython ( https://rpython.readthedocs.io/en/latest/rpython.html ).
Смысл особенностей языка прост - поддержка вывода типов. В частности, из языка убраны динамические определения классов и функций, динамическая типизация переменных, глобальные переменные стали константами, функции-генераторы транслируются в классы-итераторы и потеряли большую часть своих фич. У RPython есть большой минус - эти его ограничения сильно раздувают код, затрудняют писание и читание.
Итак, мои соображения:

1. Множественное наследование. Его нет даже на уровне C-функций в реализации питона и API расширений. «Но как же интерфейсы?» - возразите вы. Интерфейсы в C++ и Java нужны в роли объявления протоколов вызова методов объекта с целью последующей статической проверки этих протоколов при компиляции, а также для формирования таблиц методов, которые можно использовать независимо от объекта во время выполнения. Эти роли полностью потеряны в питоне, потому нет никакого оправдания их существованию. Мне нравится то, как сделаны интерфейсы в Go - это очень похоже на питоновые ABC: https://www.python.org/dev/peps/pep-3119

2. Генераторы - зло. Это прямо-таки запущенный случай GoTo, когда выполнение не просто бесконтрольно прыгает по коду - оно прыгает по стэкам. Особенно лютая дичь происходит, когда генераторы пересекаются с менеджерами контекста (привет PEP 567). В треде, скорее всего, опишу веселости реализации генераторов в PyPy/RPython. В питоне есть общая тенденция запутывать приложение в тесный клубок связанных изменяемых состояний, что не дает возможности параллелить и оптимизировать выполнение программы, а генераторы - вишенка на этом торте.

3. Изменение классов для существующих экземпляров объектов. Не, я понимаю, что класс в питоне объявляется во время выполнения. Но, блин, зачем в него совать изменяемые переменные? Зачем в старые объекты добавлять новые методы? Причем, попрошу обратить внимание на то, как нужно нагибаться раком для того, чтобы добавить аналогичные методы в сам объект, а не в класс - для этого нужны types.MethodType, function.__get__, functools.partial, и так далее. Методы в питоне вообще понадобились по простой причине - гвидо не придумал других способов сделать короткие имена функций (чтобы не было gtk_button_set_focus_on_click), поскольку не ясно, как выбирать из кучи похожих функций с коротким именем нужную под этот конкретный объект. Так в питоне появились len, iter, next, isinstance, slice, dict, dir, str, repr, hash, type - сейчас это обертки над соответствующими методами классов с подчеркиваниями в имени, а когда-то встроенные простые типы не являлись классами и работали только через эти функции. Так-то, я не вижу особой разницы между записью method(object) и object.method - особенно если method является статичной функцией, которой, в общем-то, все равно, какой первый аргумент (self) принимать.

Вот. Прошу дополнять. Да, я знаю, что у питона основные проблемы две: отсутствие статической типизации и многопоточности - но это черезчур абстрактные требования. К тому же, Javascript безо всяких типизаций достиг производительности Java, при том, что жавамакакам постоянно приходится гнуться под язык, а JS-кодеры испытывают удовольствие от говнокодинга.

★★★★

Ответ на: комментарий от Liz812

А я не думаю, что я умный. Гослинг сам сказал, чтов ОБЩЕМ случае он не понимает как работает многопоточная программа. Тред создал, не я, а тот кто считает себя умнее Гвидо Ван Россума. Вот и покажи что ты умнее создай убийцу Python. Или трындычиха как затрындычит. GIL ему помешал. Убери GIL и покажи производительность. Будет лучше Python 3.8 я тебе перешлю 1000р. А пока кукарекатель

dem ★★
()
Ответ на: комментарий от dem

Будет лучше Python 3.8 я тебе перешлю 1000р.

Обнищали питонисты совсем.

insw
()
Ответ на: комментарий от dem

И кстати, я им гораздо больше за STM башлял много раз. Жаль, что не допилили.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Да, но там есть свои беды. Расходы на память как минимум. Для чего GIL? Потому, что интерпретатор не может контролировать сторонние вызовы. Или я не прав?

dem ★★
()
Ответ на: комментарий от dem

Гослинг сам сказал, чтов ОБЩЕМ случае он не понимает как работает многопоточная программа

Это не потому, что Гослинг такой скромняжка. У многопотоков действительно есть очень серьезная проблема непредсказуемости выполнения.

Тред создал, не я, а тот кто считает себя умнее Гвидо Ван Россума

Конечно же я глупее. Потому сделаю лучше, чем Гвидо, но никто моими трудами не будет пользоваться.

Убери GIL и покажи производительность

Уже отвечал здесь: GIL не нужно убирать, она не является причиной проблем.

byko3y ★★★★
() автор топика
Ответ на: комментарий от dem

Да, но там есть свои беды. Расходы на память как минимум. Для чего GIL? Потому, что интерпретатор не может контролировать сторонние вызовы. Или я не прав?

Объектная модель питона (комментарий)

GIL здесь нужна потому, что состояния самого питона изменяемы и тесно связаны.

Сторонние функции, как раз, являются потенциально самыми беспроблемными.

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

но никто моими трудами не будет пользоваться.

Так откуда такие стоны? Жизнь не совершенна да. Но из всех ЯП Python лично мне нравится больше. Хотя я использовал и Pascal и C и C# и Java и JS. Да куча есть проблем. Но как я пересел с Python на C# я чуть не повесился.

dem ★★
()
Ответ на: комментарий от dem

Хотя я использовал и Pascal и C и C# и Java и JS. Да куча есть проблем. Но как я пересел с Python на C# я чуть не повесился.

C# и Java из списка - самые отвратительные на текущий момент. Так что неудивительно. Ты лучше Go попробуй.

byko3y ★★★★
() автор топика
Ответ на: комментарий от dem

Хотя я использовал и Pascal и C и C# и Java и JS.

Какой лучше подходит для умножения матриц?

Liz812
()
Ответ на: комментарий от dem

Потому, что примитивно. Есть цикл, в котором перебираются фреймы. В другом потоке у тебя будет крутиться точно такой же цикл, на случай гонки ввели гил, вот и всё.

WitcherGeralt ★★
()
Ответ на: комментарий от Liz812

Используй слоты. Да и вообще динамическая типизация дает как плюсы так и минусы. В свое время Торнадо порвал кучу nginxов и? Ныть не надо. Я работал в конторе где отказываются от эрланга и python в пользу Го. Так вот я порвал Го на python дописав 10 строк. Как? Просто я в базу инсертить стал не по одному insert commit а по 1000 insert и 1 коммит. Еще раз. Проц у нас 1. Ну может как у меня было 50. Но у нас и процессов дохера. Отцепитесь вы от GIL занимайтесь своими делами. 99% кода тупо получить данные по http и верефицировав запихнуть их в базу. В 99% помогает реббит или ZeroMQ или Кафка. Я врубил ЗерроМКУ и получил снижение загрузки в 10 раз минимум. Не нравится язык. Не пишите. JS так вообще ад адский с костылями типа вебпака. C# тоже индусятина. Чтоб собрать прогу требуется НЕДЕЛЯ плясок. Ruby еще похуже ибо там 1 DSL и что курил тот кто писал DSL не ясно

dem ★★
()
Ответ на: комментарий от WitcherGeralt

ВО! Я с вами часто спорю, но тут не спорю. Гил ввели от дураков

dem ★★
()
Ответ на: комментарий от peregrine

Да нет там отличия. Только видимость

dem ★★
()
Ответ на: комментарий от Liz812

Справедливости ради, в том примере (10 урлов, 10 потоков), что приводила ты — одно и то же, ибо при io гил так же преехватится и потоки будут делать запрос практически одновременно, ведь с сетью работает ядро. Но в любом случае — да, потоки в питоне — фейк.

WitcherGeralt ★★
()
Ответ на: комментарий от Liz812

Это какой говнокод надо писать, чтобы вызовы нативного Qt вешали мышь на секунды? Можно ссылку на код в студию, а то настроение плохое, а поржать хочется.

peregrine ★★★★★
()
Ответ на: комментарий от WitcherGeralt

Я не главный. Я поел его. Я могу много говорить про плюсы. Но ГО отнють не идеал. Вот я и говорю об этом

dem ★★
()
Ответ на: комментарий от peregrine

Погугли про отличие генераторов от итераторов. Может полегчает

А ниче, что я весь тред пишу про отличия генераторов от итераторов?

byko3y ★★★★
() автор топика
Ответ на: комментарий от byko3y

Ну значит и вопроса касательно их отличия быть не должно, как и должно быть очевидно, почему

list(gen(n)) вообще выдало ошибку при компиляции

peregrine ★★★★★
()
Ответ на: комментарий от dem

Ядер много, на дворе 16-ядерные процы с гипертредингом на десктопе. Это если не вспоминать про всякие тредрипперы, где ядре уже 32 (и скоро 64). Чего там на серверах мне уже даже не интересно, ведь чтобы утилизировать не самый свежий Xeon Gold мне приходится запускать одно приложение в нескольких контейнерах отлючая отдельные компоненты. И нет, у меня не рога и копыта, сервер исключительно моё приложение крутит, БД, Кролик и прочее крутятся на отдельном железе.

WitcherGeralt ★★
()
Ответ на: комментарий от peregrine

Ну значит и вопроса касательно их отличия быть не должно, как и должно быть очевидно, почему

list(gen(n)) вообще выдало ошибку при компиляции

Ну и почему же? Просвети меня, дремучего.

>>>def gen(n):
	for i in range(n):
		yield i

>>> list(gen(5))
[0, 1, 2, 3, 4]

byko3y ★★★★
() автор топика

здрасьте.
тред такой же кусок шизофозии, что и питон.
все три участника обсуждения, включая Гарика и Петю разбираются в эрланге, элексире, гошечке, жабе, вообще во всём на свете. Но при этом в ОП написано, что пистон не умеет в многопоточность… чё?
раз вы такие умные, почему тред читать невозможно и ощущение, что это батл wiki-ботов?
единственный коммент который не похож на высер бота: Объектная модель питона (комментарий) - успешно проигнорирован.

далее по теме: пистон - был говном год назад. небыло нормального евентлупа, небыло евентбаса, небыло промисов, небыло нормального orm, не прибитого гвоздями к web(sic!) фреймворку.
из «реактивности» там был этот asyncio написанный двумя идиотами. всё.
язык был всё ещё жив просто потому, что датасцаенс и машинлёрнинг используют его как обёртку над своими библиотеками.

что-то изменилось за год?

если нет - у меня вопрос: нафига наши wiki-боты обсуждают GIL вторую страницу противоестественным способом, похожим на флуд?

system-root ★★★★★
()
Последнее исправление: system-root (всего исправлений: 1)
Ответ на: комментарий от system-root

Ну а что там обсуждать еще? И так ясно, что язык и реализации предельно убоги. Еще может в 2005 году это все прокатывало на фоне всеобщего жабства, но сейчас без слез на пистон не взглянешь. Давайте может отступы пообсуждаем. Я считаю, они сосут. Возражения?

anonymous
()
Ответ на: комментарий от anonymous

отступы ещё роляют. ко мне тут практикант приходил, говорит, что пограммировать хочет на питоне, он ему нравится потому, что там нет фигурных скобочек и точек с запятой в каждой строчке.

system-root ★★★★★
()

2 пункт, ‘пословица про код на фортране’.

anonymous
()
Ответ на: комментарий от system-root

Тот комментарий достаточно капитанский, ты найдёшь это чуть ли не в каждом предыдущем питоносраче. А поворчать зашел как раз ты.

Лично я как раз пофлудить зашел и случайно нашел немного еды. Тема-то заведомо пустая по сути. Всё давно обсосано.

WitcherGeralt ★★
()
Ответ на: комментарий от WitcherGeralt

Тут уже всё обсосано. Так можно лор закрыть на readonly и подгонять просто ссылки на архивные срачи по тегам. Оставить только толксы, но запретить там обсуждать ЯП и линупс.

anonymous
()
Ответ на: комментарий от anonymous

Так вон, люди срутся, им нравится. Пусть срутся. Можно даже приобщиться к срачу маленько.

Но ведь нет, кому-нибудь обязательно нужно зайти и сказать, что все дебилы.

WitcherGeralt ★★
()
Ответ на: комментарий от dem

Замену для чего? Для вебни? Го, скала, да хоть бы и жаба, она уже не так ужасна. Признайся, что ты старый пень и уже не способен ничего нового воспринять, вот и вцепился в этот нелепый пистон зубами. Я тоже старый, и у меня похожие проблемы, но нельзя же отрицать очевидную реальность: есть современные инструменты, превосходящие на голову питон во всем, глупо ими не пользоваться. Так и останешься пронафталиненым пограмистом на коболе.

anonymous
()
Ответ на: комментарий от byko3y

Прикинь, варианта два даже на стандартном CPython. Если из консоли запускать, то будет:

Потому что в консоли объект генератора не умрет, и finally не будет вызван. finally тут работает, как деструктор. Генераторы не причем.

try:
    for i in range(10):
        print(i)
        exit(0)
finally:
    print('FINALLY!!')

Вот, тут тоже вызывается, явно после exit. В твоем примере - если при наборе в консоли ты в конце копипасты добавишь тот же exit(0), то будет тебе «Выход».

n008_b4800n
()
Ответ на: комментарий от n008_b4800n

Ээээ... Простите, а чем вам конкретно GIL мешает? Главные тормоза питона вообще в других местах.

Shadow ★★★★★
()
Ответ на: комментарий от Liz812

Не надо на питоне виджеты ристовать. В питоногуи виджеты рисуют на том языке, на котором они написаны.

Shadow ★★★★★
()
Ответ на: комментарий от Liz812

ви так шишете, будто однопоточный древний целерон не может работать в 2019 году без особых тормозов.

Shadow ★★★★★
()
Ответ на: комментарий от Liz812

получить 10 страничек с разных URL

Это жи не про потоки!
Это про асинхронность.

Shadow ★★★★★
()
Ответ на: комментарий от anonymous

Comprehensions мало кто юзает

pandas видел? Там бОльшая часть запросов такая.

Shadow ★★★★★
()
Ответ на: комментарий от Liz812

Нужно с 10 URL получить json и распарсить его, раз в минуту. На плюсах мне это писать?

асинхронно хоть с grequests брать, парсить по готовности каким-нибудь ujson (который быстрый и на Цэ).
Одного потока достаточно.

Shadow ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.