Подтвердить что ты не робот

Отличается ли производительность между Python или С++-кодированием OpenCV?

Я стараюсь начинать opencv понемногу, но сначала мне нужно решить, какой API OpenCV более полезен. Я предсказываю, что реализация Python короче, но время работы будет более плотным и медленным по сравнению с нативными реализациями С++. Есть ли какие-либо сведения, которые могут комментировать различия производительности и кодирования между этими двумя перспективами?

4b9b3361

Ответ 1

Как упоминалось в более ранних ответах, Python работает медленнее по сравнению с С++ или C. Python построен для своей простоты, мобильности и, кроме того, для творчества, когда пользователям нужно беспокоиться только об их алгоритме, а не о проблемах программирования.

Но здесь, в OpenCV, есть что-то другое. Python-OpenCV - это всего лишь оболочка вокруг исходного кода C/С++. Он обычно используется для объединения лучших функций обоих языков, Производительность C/С++ и простоты Python.

Поэтому, когда вы вызываете функцию в OpenCV из Python, то, что на самом деле выполняется, является источником C/С++. Таким образом, не будет большой разницы в производительности (я помню, я где-то читал, что штраф за производительность составляет 1%, не помню, где. Грубая оценка с некоторыми базовыми функциями в OpenCV показывает худший случай штраф <4%, т.е. penalty = [maximum time taken in Python - minimum time taken in C++]/minimum time taken in C++).

Проблема возникает, когда ваш код имеет множество собственных кодов python. Например, если вы создаете свои собственные функции, которые недоступны в OpenCV, все становится хуже. Такие коды запускаются в Python, что значительно снижает производительность.

Но новый интерфейс OpenCV-Python имеет полную поддержку Numpy. Numpy - пакет для научных вычислений на Python. Это также оболочка вокруг собственного кода C. Это высоко оптимизированная библиотека, которая поддерживает широкий спектр матричных операций, очень подходящих для обработки изображений. Поэтому, если вы можете правильно комбинировать функции OpenCV и функции Numpy, вы получите очень быстрый код.

Помните, что всегда старайтесь избегать циклов и итераций в Python. Вместо этого используйте средства управления массивами, доступные в Numpy (и OpenCV). Простое добавление двух массивов numpy с использованием C = A+B выполняется намного быстрее, чем использование двойных циклов.

Например, вы можете проверить эти статьи:

Ответ 2

Вы правы, Python почти всегда значительно медленнее С++, поскольку для этого требуется интерпретатор, которого нет на С++. Тем не менее, для этого требуется, чтобы С++ был строго типизирован, что оставляет гораздо меньший запас за ошибку. Некоторые люди предпочитают строго кодировать, тогда как другие пользуются присущей Python снисходительностью.

Если вам нужен полный дискурс по стилям кодирования Python и стилям С++, это не лучшее место, попробуйте найти статью.

EDIT: Поскольку Python является интерпретируемым языком, а С++ скомпилирован до машинного кода, вообще говоря, вы можете получить преимущества производительности с помощью С++. Однако, что касается использования OpenCV, основные библиотеки OpenCV уже скомпилированы до машинного кода, поэтому оболочка Python вокруг библиотеки OpenCV выполняет скомпилированный код. Другими словами, когда дело доходит до выполнения вычислительно дорогостоящих алгоритмов OpenCV из Python, вы не увидите большую часть производительности, поскольку они уже скомпилированы для конкретной архитектуры, с которой вы работаете.