Как @littleidea и другие пользователи указали, что ваша версия numpy использует LAPACK / BLAS / ATLAS, которая будет намного быстрее, чем все, что вы делаете в clojure, поскольку она была настроена годами.:)
Тем не менее, самая большая проблема с кодом Clojure заключается в том, что он использует Double, как в штучной упаковке.Я называю это проблемой «ленивый двойник», и я сталкивался с ней на работе несколько раз.На данный момент, даже с 1.3, коллекции clojure не являются примитивно дружественными.(Вы можете создать вектор примитивов, но это вам не поможет, так как все функции seq. В конечном итоге их упаковывают! Я должен также сказать, что примитивные улучшения в 1.3 довольно хороши и в конечном итоге помогают ... мы простоне существует 100% поддержки примитивов WRT в коллекциях.)
При выполнении любой математической математики в clojure вам действительно необходимо использовать Java-массивы или, еще лучше, матричные библиотеки.Incanter действительно использует parrelcolt, но вы должны быть осторожны с тем, какие функции incanter вы используете ... так как многие из них делают матрицы пригодными для секвенции, что приводит к тому, что они удваивают двойные значения, давая вам производительность, аналогичную той, что вы видите в настоящее время.(Кстати, у меня есть свои настроенные упаковщики parrelcolt, которые я мог бы выпустить, если вы думаете, что они будут полезны.)
Чтобы использовать библиотеки BLAS, у вас есть несколько вариантов в java-land.Со всеми этими опциями вы должны заплатить налог JNA ... все ваши данные должны быть скопированы, прежде чем они могут быть обработаны.Этот налог имеет смысл, когда вы выполняете связанные с процессором операции, такие как матричные декомпозиции, и время обработки которых занимает больше времени, чем время, необходимое для копирования данных.Для более простых операций с небольшими матрицами пребывание в java-земле, вероятно, будет быстрее.Вам просто нужно сделать несколько тестов, как вы сделали выше, чтобы увидеть, что лучше всего подходит для вас.
Вот ваши варианты использования BLAS из Java:
http://jblas.org/
http://code.google.com/p/netlib-java/
Я должен отметить, что parrelcolt использует проект netlib-java.Это значит, я верю, что если вы настроите его правильно, он будет использовать BLAS.Однако я не проверил это.Объяснение различий между jblas и netlib-java смотрите в этой ветке, которую я начал об этом в списке рассылки jblas:
http://groups.google.com/group/jblas-users/browse_thread/thread/c9b3867572331aa5
Я также должен указать на библиотеку Universal Java Matrix Package:
http://sourceforge.net/projects/ujmp/
Он охватывает все библиотеки, которые я упомянул, а затем и некоторые!Я не слишком много смотрел на API, хотя, чтобы знать, насколько утечки их абстракция.Это похоже на хороший проект.Я закончил тем, что использовал свои собственные оболочки parrelcolt clojure, поскольку они были достаточно быстрыми, и мне действительно очень понравился API-интерфейс colt.(Colt использует функциональные объекты, что означает, что я смог просто передать закрывающие функции без особых проблем!)