Какой язык программирования для моделирования компьютерного портфеля с интенсивными вычислениями? - PullRequest
6 голосов
/ 13 июня 2010

Я строю систему управления торговым портфелем, которая отвечает за производство, оптимизацию и моделирование не высокочастотных торговых портфелей (работа с 1-минутными или 3-минутными столбцами данных, а не тиковыми данными).

Я планирую использовать веб-службы Amazon для полной загрузки приложения.

У меня есть четыре варианта выбора, которые я рассматриваю как язык.

  1. Java
  2. C ++
  3. C #
  4. Python

Здесь находится область крайностей области проекта.Это не так, как может быть, возможно, когда-либо, но это в рамках требований:

  • Еженедельное моделирование 10 000 000 торговых систем.
  • (Ожидается, что каждая торговая система будетимеют свои собственные методы извлечения данных, в том числе алгоритмы выбора функций, которые являются чрезвычайно дорогостоящими в вычислительном отношении. Представьте себе 500-5000 функций, использующих обертки. Они не часто запускаются какими-либо средствами, но это все еще рассматривается)
  • В режиме реального временипроизводство портфеля с 100 000 торговых стратегий
  • Получение за 1 или 3 минуты данных с каждого рынка акций / фьючерсов по всему миру (около 100 000)
  • Оптимизация портфеля с использованием до 100 000 стратегий,(довольно интенсивный алгоритм)

Скорость - это проблема, но я считаю, что Java может справиться с нагрузкой.

Я просто хочу убедиться, что Java CAN справится с вышеуказанными требованиями с комфортом.Я не хочу делать проект на C ++, но я сделаю это, если потребуется.

Причина, по которой здесь присутствует C #, заключается в том, что я подумал, что это хорошая альтернатива Java, хотя мне и не нравитсяWindows вообще и предпочла бы Java, если все вещи одинаковы.

Python - я прочитал кое-что о PyPy и pyscho, которые утверждают, что python может быть оптимизирован с JIT-компиляцией для работы на скоростях, близких к C ..Это в значительной степени единственная причина, по которой он находится в этом списке, кроме того факта, что Python является отличным языком и, вероятно, будет самым приятным языком для программирования, что вовсе не является фактором для этого проекта, но перк.

Подводя итог:

  • производство в реальном времени
  • еженедельное моделирование большого числа систем
  • еженедельная / ежемесячная оптимизация портфелей
  • большое количество соединений для сбора данных из

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

Спасибо вам большое за вашу мудрость.

Ответы [ 7 ]

5 голосов
/ 14 июня 2010

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

Для многих проектов производительность PythonЭто не проблема, но в вашем случае даже незначительные потери производительности будут очень быстро накапливаться.Я знаю, что это не симуляция в реальном времени, но даже для пакетной обработки это все же необходимо учитывать.Если окажется, что нагрузка слишком велика для одного виртуального сервера, реализация, которая в два раза быстрее, сократит вдвое затраты вашего виртуального сервера.

Для многих проектов я бы также сказал, что Python позволит вам разработать решениебыстрее, но здесь я не уверен, что это будет так.Java обладает инструментами разработки мирового класса и первоклассными средами корпоративного уровня для обработки параллельных процессов и развертывания на нескольких серверах, и хотя у Python есть решения в этой области, у Java явно есть преимущество.У вас также есть архитектурные опции с Java, с которыми Python не может сравниться, например Javaspaces.

Я бы сказал, что C и C ++ накладывают слишком много накладных расходов на разработку для такого проекта.Они жизнеспособны, потому что, если вы очень хорошо знакомы с этими языками, я уверен, что это будет выполнимо, но кроме потенциала для повышения производительности, им больше нечего привнести в таблицу.

C # простопереписать Java.Это неплохо, если вы являетесь разработчиком Windows и если вы предпочитаете Windows, я бы использовал C #, а не Java, но если вы не заботитесь о Windows, нет причин заботиться о C #.

5 голосов
/ 13 июня 2010

Выберите язык, с которым вы наиболее знакомы.Если вы знаете их всех одинаково, и скорость - это реальная проблема, выберите C.

4 голосов
/ 13 июня 2010

Я бы выбрал Java для этой задачи. С точки зрения оперативной памяти различие между Java и C ++ заключается в том, что в Java каждый объект имеет служебную нагрузку в 8 байт (при использовании 32-разрядной виртуальной машины Sun или 64-разрядной виртуальной машины Sun со сжатыми указателями). Так что если у вас есть миллионы объектов, летающих вокруг, это может иметь значение. С точки зрения скорости, Java и C ++ практически равны в этом масштабе.

Так что для меня важнее время разработки. Если вы допустили ошибку в C ++, вы получите ошибку сегментации (а иногда даже не получите ее), в то время как в Java вы получите хорошее исключение с трассировкой стека. Я всегда предпочитал это.

В C ++ вы можете иметь коллекции примитивных типов, которых нет в Java. Вам придется использовать внешние библиотеки, чтобы получить их.

Если у вас есть требования в режиме реального времени, сборщик мусора Java может создавать неудобства, поскольку сбор кучи размером 20 ГБ занимает несколько минут, даже на компьютерах с 24 ядрами. Но если вы не создаете слишком много временных объектов во время выполнения, это тоже подойдет. Просто ваша программа может приостановить сбор мусора, когда вы этого не ожидаете.

4 голосов
/ 13 июня 2010

Напишите это на предпочитаемом вами языке. Для меня это звучит как питон. Когда вы запускаете систему, вы можете профилировать ее и видеть узкие места. Как только вы сделаете некоторые базовые оптимизации, если это все еще не приемлемо, вы можете переписать части в C.

Можно было бы написать это на железном питоне, чтобы воспользоваться преимуществами clr и dlr в .net. Тогда вы можете использовать .net 4 и параллельные расширения. Если что-то и даст вам повышение производительности, это будет что-то вроде многопоточности, что .net делает очень хорошо.

Edit:

Просто хотел прояснить эту часть. Исходя из описания, звучит так, что параллельная обработка / многопоточность - вот откуда будет происходить большинство прироста производительности.

3 голосов
/ 13 июня 2010

Почему только один язык для вашей системы?На вашем месте я построю всю систему на Python, но C или C ++ будут использоваться для компонентов, критичных к производительности.Таким образом, у вас будет очень гибкая и расширяемая система с достаточно высокой производительностью.Вы можете найти даже инструменты для автоматического создания оболочек (например, SWIG, Cython).Python и C / C ++ / Java / Fortran не конкурируют друг с другом;они дополняют.

0 голосов
/ 14 июня 2010

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

Если внутренний цикл является матричной операцией, то я предлагаю Python и Scipy, но для внутреннего цикла, если не матричная операция, я бы беспокоился о том, что Python медленный.(Или, может быть, я бы обернул C ++ в Python, используя Swig или Boost :: Python)

Преимущество Python в том, что его легко отлаживать, и вы экономите много времени, не компилируя все время,Это особенно полезно для проекта, где вы проводите много времени, программируя глубокие внутренние аспекты.

0 голосов
/ 13 июня 2010

Я бы пошел с pypy.Если нет, http://lolcode.com/.

...