Вообще лично я для объектов которые подразумеваются как «неизменяемые» пишу конструкторы без new, а для изменяемых — с new. В том же примере сверху — Vector — как раз «неизменяемый».
IPC, конечно же дороже. Процессы в этом случае не используют. Процессы используют, например, при организации архитектуры сервера веб-приложений для параллельной обработки потока запросов.
Я просто о том, что использование нельзя использовать нативные потоки для реализации параллельных алгоритмов — когда вы пытаетесь запустить их несколько тысяч, затраты процессорного времени на их запуск и обслуживание нивелируют весь профит от их использования. А если их ещё и синхронизировать надо, то тут вообще всё плохо: синхронизация потоков — «тяжёлая» операция. Для таких вещей используют CUDA, OpenCV или OpenMP, которые позволяют запускать процедуры в чисто параллельном режиме. Но и там куча своих ограничений.
Я не думаю что GIL считается «священной коровой»: просто была бы возможность сделать pure-параллельный Питон, без GIL, нативно написанный на C (а не «слоёный», как JPython и IronPython), то её реализуют. Просто сейчас наличие GIL не считается вселенским злом, которое мешает жить Питон-программистам. Ну есть GIL, и есть. Язык отличный, приложения на нём пишутся и прекрасно работают. А если надо реализовать какое-нибудь более производительное решение — берётся C и реализуется.
Ну а производительные многопоточные решения на мультиядерных системах никто на Питоне и не пишет: для это есть C, Go и Java, CUD'ы всякие, OpenMP и прочее.
Хм, представьте себе одноядерную однопроцессорную машину. Что будет быстрее выполняться на этой машине: программа которая исполняет параллельный алгоритм в многопоточном режиме или программа которая исполняет этот же алгоритм в последовательном режиме.
А кто говорит что GIL ускоряет однопоточные программы?
Просто сравнивать Jav-у, С++ с Питоном нет смысла — это разные вещи. Питон — четкий однопоточный интерпретатор, по-крайней мере в классической реализации.
GIL — это просто решение, позволяющее разработчику абстрагироваться от потокобезопасности нативного кода, стоящего за инструкциями Питона. Для интерпретируемого языка для общих задач — вполне нормальное решение.
Я просто о том, что использование нельзя использовать нативные потоки для реализации параллельных алгоритмов — когда вы пытаетесь запустить их несколько тысяч, затраты процессорного времени на их запуск и обслуживание нивелируют весь профит от их использования. А если их ещё и синхронизировать надо, то тут вообще всё плохо: синхронизация потоков — «тяжёлая» операция. Для таких вещей используют CUDA, OpenCV или OpenMP, которые позволяют запускать процедуры в чисто параллельном режиме. Но и там куча своих ограничений.
с блэкджекомбез GIL'а и с потоками :)Процессами всё масштабируется. В веб-приложениях это прекрасно работает.
Просто сравнивать Jav-у, С++ с Питоном нет смысла — это разные вещи. Питон — четкий однопоточный интерпретатор, по-крайней мере в классической реализации.
GIL — это просто решение, позволяющее разработчику абстрагироваться от потокобезопасности нативного кода, стоящего за инструкциями Питона. Для интерпретируемого языка для общих задач — вполне нормальное решение.