Текущий «лучший ответ» звучит слишком похоже на FUD в моих ушах. С одной стороны, не сразу очевидно, что средний разработчик написал бы более быстрый код на C, чем в любом случае дает вам NumPy + Cython. Напротив, время, необходимое для того, чтобы даже заставить необходимый C-код работать правильно в среде Python, обычно гораздо лучше инвестируется в написание быстрого прототипа на Cython, его сравнительный анализ, оптимизацию, переписывание более быстрым способом, сравнительный анализ снова и затем , решая, есть ли в нем что-либо, что действительно требует на 5-10% большей производительности, которую вы можете получить, а можете и не получить, переписав 2% кода в вручную настроенном C и вызвав его из ваш код Cython.
Я пишу библиотеку на Cython, которая в настоящее время содержит около 18K строк кода Cython, которые переводят почти в 200K строк кода C. Однажды мне удалось добиться ускорения почти на 25% для пары очень важных функций внутреннего базового уровня, введя около 20 строк вручную настроенного кода C в нужных местах. Мне потребовалось несколько часов, чтобы переписать и оптимизировать эту крошечную часть. Это действительно ничто по сравнению с огромным количеством времени, которое я сэкономил, не написав (и не поддерживая) библиотеку на простом C, во-первых.
Даже если вы знаете C намного лучше, чем Cython, если вы знаете Python и C, вы выучите Cython так быстро, что в любом случае это стоит вложений, особенно когда вы работаете с цифрами. 80-95% кода, который вы пишете, получат столько пользы от написания на языке высокого уровня, что вы можете спокойно откладывать и тратить половину времени, которое вы сэкономили, на создание кода так же быстро, как если бы вы его написали. на языке низкого уровня прямо сейчас.
Тем не менее, ваш комментарий о том, что вы хотите "иметь возможность распространять код в виде автономных библиотек C / C ++", является веской причиной придерживаться простого C / C ++. Cython всегда зависит от CPython, который является довольно зависимым. Однако использование простого C / C ++ (за исключением интерфейса Python) также не позволит вам воспользоваться NumPy, поскольку это также зависит от CPython. Поэтому, как обычно, когда пишете что-то на C, вам придется проделать большую работу, прежде чем вы перейдете к реальной функциональности. Вы должны серьезно подумать об этом дважды, прежде чем начинать эту работу.