NVIDIA CUDA(сиквел) — Настройка PyCUDA

    image
    В продолжение темы Настройка Ubuntu 8.10 для кодинга под NVIDIA CUDA, я решил наладить себе рабочее место для использования одного из моих любимых языков программирования — Python. Для этого существует отличный набор библиотек PyCUDA, позволяющий реализовывать все прелести NVIDIA CUDA API с помощью удобного и красивого кода. Приведу пример кода из стандартной комплектации PyCUDA:
    import pycuda.autoinit
    import pycuda.driver as drv
    import numpy

    mod = drv.SourceModule("""
    __global__ void multiply_them(float *dest, float *a, float *b)
    {
    const int i = threadIdx.x;
    dest[i] = a[i] * b[i];
    }
    """)

    multiply_them = mod.get_function("multiply_them")

    a = numpy.random.randn(400).astype(numpy.float32)
    b = numpy.random.randn(400).astype(numpy.float32)

    dest = numpy.zeros_like(a)
    multiply_them(
    drv.Out(dest), drv.In(a), drv.In(b),
    block=(400,1,1))

    print dest-a*b

    Не правда ли, удобно и просто?

    Начнем!


    Для нормальной работы PyCUDA нам потребуются:

    — Машина с UNIX-подобной системой и доступом к интернету.
    — Nvidia CUDA toolkit. PyCuda была разработана с оглядкой на версию 2.0 beta, однако у меня она вроде как нормально работает и с 2.1 beta.
    — C++ компилятор, желательно gcc версии не ниже 4.х.
    — Установленный интерпретатор Python, версия 2.4 или новее.

    Теперь установим последнюю версию библиотеки Boost C++. Перед установкой стоит проверить, установлен ли девелоперский пакет для Python, он будет называться python-dev или python-devel. Установка фактически стандартная, только не надо забывать задать префикс — каталог для собранных инклюдов. В данном случае пусть будет $HOME/pool.

    $ tar xfj ~/downloads/boost_1_37_0.tar.bz2
    $ cd boost_1_37_0
    $ ./configure --prefix=$HOME/pool
    $ make
    $ make install


    После сборки (должна пройти успешно) проверяем, появилась ли папка $HOME/pool. Если да — то все путем, идем дальше :)

    Важное примечание: Если в конце установки появилось что-то в духе
    ...failed updating 30 targets...
    ...skipped 2 targets...

    то еще раз перепроверьте, установлены ли у вас девелоперские заголовки питона. Если не удалось обновить всего лишь несколько файлов (менее 5), то, скорее всего, все будет работать нормально, но для верности можно поставить libz-dev и libbz2-dev и собрать Boost заново.

    Теперь добавим путь к только что откомпилированным библиотекам в переменную окружения:
    $ export LD_LIBRARY_PATH=$HOME/pool/lib:${LD_LIBRARY_PATH}

    Если этого не сделать, то на этапе сборки PyCUDA появится что-то вроде:
    ...blablabla...
    ImportError: libboost_python-gcc42-mt-1_35.so.1.35.0:
    cannot open shared object file: No such file or directory
    ...blablabla...


    Качаем саму PyCUDA и переходим в каталог с ней.
    $ cd $HOME/downloads/pycuda-0.91.1

    Нужно установить пакет numpy. Сделать это можно, либо скачав его самому с numpy.org и собрать, либо с помощью самой PyCUDA. Поскольку мы уже перешли в каталог с дистрибутивом, просто набираем:
    $ sudo python ez_setup.py //установка setup-tools
    $ sudo easy_install numpy //установка numpy с помощью setup-tools


    Порядок.

    Собираем PyCUDA.


    Осталось последнее и самое главное — установить саму PyCUDA. Главная сложность состоит в том, что нужно задать кучу опций при конфигурировании.
    $ ./configure \
    --boost-inc-dir=$HOME/pool/include/boost-1_37 \
    --boost-lib-dir=$HOME/pool/lib \
    --boost-python-libname=boost_python-gcc41-mt \
    --cuda-root=/where/ever/you/installed/cuda


    А теперь — внимание! Если с первыми двумя параметрами все понятно (объяснялось выше), то два последних нуждаются в объяснении. boost_python-gcc41-mt — это имя библиотеки, в которой gcc41 — версия компилятора, с помощью которого вы собирали boost. Как я писал в предыдущей статье, при программировании под CUDA обычно должна использоваться версия 4.1, но если вы не выставили ее системной по умолчанию — то это в данном случае неактуально. Проверить версию активного компилятора можно, набрав
    $ gcc -v

    Ну а в последнем пункте, как несложно догадаться, нужно заменить /where/ever/you/installed/cuda на каталог с CUDA, то есть по умолчанию /usr/local/cuda.

    Кстати, перед вводом make install можно еще раз перепроверить введенные адреса. Они все сохраняются в файле siteconf.py, который создается при конфигурировании. У меня он перед сборкой выглядел вот так:
    BOOST_INC_DIR = ['/home/username/pool/include/boost-1_37']
    BOOST_LIB_DIR = ['/home/username/pool/lib']
    BOOST_PYTHON_LIBNAME = ['boost_python-gcc41-mt']
    CUDA_ROOT = '/usr/local/cuda'
    CUDADRV_LIB_DIR = []
    CUDADRV_LIBNAME = ['cuda']
    CXXFLAGS = []
    LDFLAGS = []

    Если вы хотите переконфигурировать PyCUDA с новыми параметрами — то сначала удалите этот файл. Либо можно просто внести в него изменения и набрать
    $ sudo python setup.py build

    Теперь можно смело компилировать:
    $ sudo make install

    Если все сделано правильно — то ошибок при сборке быть не должно. Перезагружаем компьютер, и для полной уверенности можно пойти в каталог
    /pycuda-0.91.1/test(или какая у вас там версия) и запустить test_driver.py.

    $ cd /pycuda-0.91.1/test
    $ python test_driver.py


    Если в результате появилось ОК — то все в шоколаде. Если одна-две ошибки (у меня почему-то иногда случались глюки с памятью) — просто попробуйте чуть позже еще раз.

    Спасибо, что дочитали до конца, буду рад выслушать критику :)

    АПД: Все получилось настроить, в том числе работу в Eclipse. Проблема была в том, что были выставлены неверные права на папку кэша пикуды, проще всего сделать так:
    $ sudo chmod 0777 -R /home/username/.pycuda-compiler-cache

    Ну и кроме всего прочего, ни интерпретатор, ни сам Eclipse не должны быть запущены из-под рута. Ибо переменные окружения другие :) Спасибо за помощь в настройке товарищу Riz.
    Share post

    Similar posts

    Comments 67

      +7
      Каа — он удавом был, а не питоном ;-)
        +2
        Знаю, но картинка понравилась :)
          +2
          Каа был питоном. Ибо азиат. В Азии, Африке и Австралии обитают именно питоны. А в Южной америке и на Мадагаскаре — удавы.
          +2
          хорошая статья, спасибо пригодится.
            0
            PyCUDA лучше взять из SVN, у меня она работает на порядок стабильнее и не имеет проблем с прогонами тестов драйвера.
              +1
              Спасибо! Не знал, что есть биндинги для питона :-)
                0
                PyCUDA — забавно, может есть еще и phpCUDA? :)
                *сарказм*
                  –5
                  и что же забавного?
                    +6
                    Реализация параллельных вычислений с помощью GPU на скриптовом, интерпретируемом языке, использующемся преимущественно в совершенно иных целях и не обладающим высокой производительностью мне показалась забавной. Сарказм в том, что если идти в том же направлении — можно реализовать и CUDA на php.

                    (Не хотел сказать ничего плохого ни в сторону Python ни в сторону php, сам пишу на php)
                      +5
                      Ага. Это как купить Феррари и прицепить к ней сзади якорь =)
                        0
                        Вы когда-нибудь работали с библиотеками для численных методов?
                          0
                          Нет. И?
                            +1
                            Зачем тогда приводить такие сравнения? Просто для красного словца?

                            С реалиями они никак не соотносятся.
                              0
                              Я уверен что Феррари якорь стянет. Но на пользу он ей не пойдет.
                              Вот и библиотеки эти написали почему то на Сях, а GUI к ним зачем то на python+gtk.
                              Да — работает. Как и Феррари с якорем едет помаленьку. А ведь может быстрее.
                                +2
                                Какая-то сквозит безграничная уверенность в просто заоблачных скоростях магического Си :)

                                Может погоняемся?
                                У меня вот есть задачка простенькая, минут на 10-20 делов — посчитать частоты слов в текстовом файле (утф-8) и вывести 100 самых частых слов.

                                Я пишу на Питоне и Java, а вы на Си. Погладим на сколько ваша феррари будет быстрее, если поедет конечно :)
                                  0
                                  Вы будете считать слова в файле с помощью CUDA? :)
                                    0
                                    А как Вы будете учитывать время, необходимое Питону и Java для компиляции?
                                      0
                                      это время загрузки кода, не более ) а если эта программа запущена всегда, то это вообще можно не учитывать.

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

                                      и между прочим, скорость работы виртуальной машины явы сейчас во многих случаях догнала си, на эту тему есть материал в инете, можете поискать
                                        0
                                        Ну не скажите — скорость загрузки, это очень важно. Хотя, конечно, все зависит от ситуации — если Вы при старте системы грузите фотошоп и потом день в нем работаете, можно и потерпеть. Но наверняка для просмотра картинок у Вас стоит что-то легкое и шустрое. И была бы альтернатива фотошопу, такая же мощная, но легкая и шустрая — фотошоп бы забросили.

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

                                        Что до явы. Я тут как-то пробовал Zend Studio. Ужас. Офигенно мощный тормоз.
                                          0
                                          просмотр картинок — ну да, но это уже не на тему «почему хорошо делать обертку над CUDA-подобными вещами». во-вторых, уж если на то пошло, у ява-машины есть утилита (не помню как называется, но ставится вроде по умолчанию при установке jre), которая после первого запуска программы ускоряет последующие запуски, и старт практически мгновенный. такая техника еще используется, насколько я помню, для ms/open office

                                          >Zend Studio
                                          не пробовал, но, если он тормозит также как эклипс, значит он аналогично дерьмово сделан. попробуйте netbeans, он весьма шустрый.
                                            0
                                            А с чего вдруг Нетбинс сильно шустрее Эклипса?

                                            Стартует Эклипс медленее, это обусловлено его архитекрурой, но в остальном большой разницы не заметно.
                                              0
                                              не знаю, с чего… видимо лучше написан. у меня он работает ощутимо шустрее (и не глючит, в отличии от эклипса). может быть, у вас посто достаточно быстрый комп, поэтому разницы не заметно? )
                                              а стартует вроде не особо быстрее, но это и не важно
                                                0
                                                Видимо просто Эклипс какой-то не такой или не так поставился. У меня

                                                uname -a
                                                Linux black 2.6.28-gentoo #4 SMP PREEMPT Mon Jan 5 19:22:24 IRKT 2009 i686 Intel® Pentium® D CPU 3.00GHz GenuineIntel GNU/Linux

                                                2G RAM

                                                не глючит ни Клипса, ни Бинс.
                                                На Целероне 2.4 под ВинХП тоже всё нормально работало.

                                                Надо сказать Бинс проще в установке и освоении, там больший упор сделан на «поставил и заработало», а в Клипсу надо вникать, так как это в первую очередь платформа, а потом уже IDE.
                                                  0
                                                  а, ну вот, а у меня ~1.7 проц, 512 рам, видать старичек не тянет ) но бинсы вот тянет.
                                                  сижу пока на винде.
                                                  эклипс глючил иногда конкретно, переодически выскакивали какие-то ошибки, один раз вообще запилил мне js-файл (я где-то уж писал об этом), после этого я благополучно сбежал на нетбинс.

                                                  ну не знаю, насчет «вникать», по-моему вообще одинаково, модульно, те же плагины, одинаковый функционал. только у нетбинса как-то все приятнее и прямее.
                                              +1
                                              В винде такое ускорение встроено в систему. Тот же фотошоп первый раз после перезагрузки грузится секунд 10. Если его закрыть и открыть снова — секунд 5. В Ms Office была похожая штука — тока она грузилась не первый раз при старте офиса, а при старте винды. В последних версиях этого уже нет. Есть в Adobe Acrobat Reader. В любом случае это костыль, который частично решает проблему, но создает другую.

                                              >netbeans
                                              спасибо за совет. я нашел уже nusphere phpEd. он вроде нативный
                                          0
                                          При чём здесь время компиляции?
                                            0
                                            Ну я вроде объяснял уже f33l выше, что пока запустится интерпретатор, пока он скомпилит ваш скрипт, нативное приложение уже работает.
                                            То есть, если мы разогнались оба до 100 км/ч, то приедем в одно время. Но неплохо бы еще учитывать за сколько каждый набрал эту сотню.
                                              0
                                              Нативное приложение тоже, кстати, надо загружать.
                                              И это время тоже бывает заметно, если загружаем не hello world, конечно.

                                              Сейчас запустил Eclipse, стартовало вместе с полным фаршем (Java/Sql/Python/SVN/Tasks/...) 22 секунды. Если пересчитать на рабочее время (3-4 часа), то это будет менее 0.2%. На чём здесь собираетесь сэкономить?

                                              Кстати, а сколько запускается VisualStudio с тремя-четырьмя проектами (по 5-10 тыс строк) в аналогичной конфигурации?
                                                0
                                                Студия на .net написана — так что это тоже не натив. Впрочем на глаз грузится она и работает шустрее Eclipse. Не в разы, конечно.

                                                Возвращаясь к Вашему предложению погонятся. Не могли бы Вы все-таки набросать на питоне указанную задачу? Гонятся я не буду, просто хочу посмотреть как это правильно написать на питоне.
                                                  0
                                                  Вот здесь код — pastebin.com/m2552fe27
                                                  он больше экспериментальный, там выключен юникод и чтение файла сделано не итератором, а одним куском, что не есть гуд.

                                                  Еще использование в sort() параметра key=operator.itemgetter(1) вместо lambda x,y: дает порядка 10-ти процентов выигрыша.

                                                  Рекомендую написать то же самое на «компилируемом языке» и удивиться насколько мала разница. Запросто может получиться, что с первого раза обогнать Питон не получится :)

                                                  Да, вот еще похожий вариант на Руби:

                                                  c={}
                                                  t=Time.now
                                                  STDIN.each { |line| line.split.each { |w| c[w]||=0;c[w]+=1 } }
                                                  c.keys.sort.each { |w| puts "#{w}\t#{c[w]}" }
                                                  puts Time.now-t

                                                  но Руби по своей сути работает медленнее, тут ничего не поделаешь.

                                                  И вообще, я думаю, продолжение дискуссии давно стоит перенести куда-нибудь. Тут про NVIDIA все-таки :)

                                                  icq:3861496
                                                  xmpp:maxp@jabber.ru
                                                    0
                                                    ок. спасибо.
                              0
                              Рекомендую ознакомиться с насколько серьезно и эффективно подходят люди к решению численных задач с помощью Python'а

                              numpy.scipy.org/
                              numpy.scipy.org/numpydoc/numdoc.htm
                              www.scipy.org/

                              возможно тогда байндинги на NVIDIA не покажутся такими забавными.
                                +2
                                Это прекрасно что для Python'а есть такие библиотеки. Я просто считаю что подобные библиотеки на С++ быстрее.
                                  0
                                  Сами библиотеки и есть на Си, в том-то и прикол.
                                  Очень удобно бывает использовать гибкость Питона совместно с числодробилками.
                                    –1
                                    Гибкость Питона наверняка это здорово. Просто для меня лично, например, чуждо разрабатывать десктопное приложение на некомпилируемом в машинный код языке.
                                      0
                                      Ну это уже чисто личные пристрастия.

                                      Вот мне чуждо разрабатывать что-либо на PHP, однако я стараюсь не делать из своих предпочтений далеко идущих глобальных выводов :)
                                        0
                                        Так я и не говорю за всю Одессу. Только за себя. (Хотя хабра-народ ко мне сегодня какой-то лояльный, судя по плюсам).

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

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

                                          думаю, у вас и у плюсующих/минусующих просто еще недостаточно опыта, потому что кроме скорости работы кода есть еще масса факторов, особенно в сложных проектах.
                                            0
                                            >я разницу в скорости между нормально написанными десктопными приложениями на си и яве например замечаю только при их старте или подгрузке компонентов, а вы?

                                            Я вообще не замечаю. У меня нет ничего на яве. На .Net и то только VisualStudio =)
                                              –1
                                              и все лицензионное, да? :]
                                                +1
                                                Лицензия как-то влияет на скорость? =)

                                                PS. О минусовать пошли. Людям стало скучно
                                            0
                                            А Вы какие приложения разрабатывали?

                                            Дело в том, что большинство программистов решают конкретные программистские задачи, а не идеологические.

                                            Практические задачи пишутся под конкретные условия за определенное время.

                                            Приложение на Питоне, работающее на 10% медленнее, чем аналогичное на Си, но укладывающееся в заданные временные рамки значительно лучше приложения на Си, которое работает на 10% быстрее, но по непонятным причинам падает в кору в самых неподходящих местах.

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

                                            Есть такое наглядное правило 10/90 — «десять процентов кода потребляют девяносто процентов машинного времени».
                                            И очень часто эти самые дорогие 10% это как раз уже донельзя соптимизированные библиотечные функции работы с массивами, строками, списками.
                                            Можно убиться оптимизировать остальные 90% кода и не выиграть по сути ничего.
                                              0
                                              У меня нет идеализации. Есть простая логика.
                                              1. Запустить виртуальную машину
                                              2. С помощью JIT-компиляции получить машинный код
                                              3. Выполнить машинный код

                                              3 шага.

                                              1. Выполнить машинный код.

                                              1 шаг, раный 3му из предыдущего варианта.

                                              В итоге по-моему очевидно, что сделать 1 шаг быстрее чем три.

                                              Со всем остальным я соглашусь, только соотношение обычно 20/80.
                                                0
                                                Соотношение именно 10/90 (см. google: 90/10 rule), а если оно вдруг 80/20, то скорее всего просто кода мало написано или в нем есть просто лишняя часть :)

                                                Шаг номер один на самом деле вовсе не такой тривиальный, как кажется.
                                                Понятие динамическая линковка знакомо?

                                                И я не очень понял почему мы вдруг сравниваем время загрузки какой-то маленькой программки и время загрузки jvm? Почему мы вообще перешли на обсуждение времени запуска? На мой взгляд оно находится далеко не на первом месте по важности.

                                                  0
                                                  Про соотношение. Я исходил из этого ru.wikipedia.org/wiki/Закон_Парето

                                                  Про динамическую линковку лучше поподробнее.

                                                  Если брать ваш пример когда с утра загрузили, вечером закрыли — возможно и не важно.
                                                  Если программа постоянно в памяти не висит, а отрабатывает свое и выходит — время загрузки уже существеннно.
                                      +2
                                      возможно что на языке более низкого уровня, к примеру C или ассемблере, еще быстрее. впрочем, даже не возможно, а так и есть. но порой скорость разработки важнее скорости выполнения ;)
                                        0
                                        Главное, чтобы после быстрой разработки и получения результатов у написавшего хватало ума/освободившегося времени/терпения их проверить и проанализировать, а не публиковать результаты :) Это я про науку.
                                          +1
                                          Плюсы здесь как пример — можно поставить любой компилируемый язык. Что до скорости — то как программер я Вас, конечно, прекрасно понимаю. Но как юзверю, скорость выполнения мне важнее.
                                      +1
                                      а я не вижу никакого противоречия, напротив. вы видимо не понимаете, что на питоне в данном случае реализоввываются не сами вычисления, а высокоуровневый интерфейс к устройству. смысл как раз в том, чтобы контролировать объекты, параллельно производящие интенсивные вычисления, и для контроля важна гибкость и удобство, а не производительность.
                                      тот же erlang для чего сделан, не задумывались?
                                      по вашему, графические движки, например, надо на ассемблере писать, работая напрямую с видеокартой?
                                      а вот php тут не к месту по многим причинам.
                                        +1
                                        Объясните пожалуйста, по каким причинам php здесь более не к месту, чем python?
                                        (не считая прямого назначения php, а то тут еще начнут говорить, что php это просто «инструменты для создания персональных веб-страниц» или препроцессор гипертекста. Давайте говорить об архитектурных особенностях языков, делающих уместными те или иные вещи)

                                        p.s.: я не пытаюсь спорить, ибо тонкости питона мне неведомы :) Я просто интересуюсь.
                                          +1
                                          как раз назначение тут играет большую роль. пхп для веб-разработки, так исторически сложилось, и продолжает развивается он только в эту сторону. питон же универсален, и как ни пародоксально, на нем эффективно решается широкий круг задач, от игровых серверов до маленьких утилит. так он устроен, гибко, красиво и лаконично.
                                          не буду сравнивать сам язык с пхп, потому что это ведет прямо к холивару — надеюсь, вы не с этой целью задали вопрос, хоть он уже и не по теме ветки. но язык характеризует не только его архитектура, но и набор библиотек, расширений, фреймворков и т.д.
                                          и если посмотреть с этой точки зрения на пхп и питон, то становится хорошо видно, что более уместно.

                                          я тоже пишу пока еще на пхп, кстати, если что.
                                            +1
                                            Вы недооцениваете php, вот навскидку:
                                            gtk.php.net/
                                            php-qt.org/
                                            winbinder.org/
                                              0
                                              да видел я это все )
                                              +2
                                              Ню-ню. Если закрыть глаза на стандартный пролог <?php, то РНР вполне себе годный general-purpose язык. Тут вам выше привели phpшные биндинги к GTK, QT и WinAPI. Рисовать гуй можно. Java-like ООП присутствует. А игрища с блудницами реализуются посредством расширений на C/C++. И вообще, UNIX-way ещё никто не отменял.
                                              Я это всё к тому, что на РНР можно делать практически всё то же, что и на питоне. Да, более многословно, с бóльшим геморроем — но можно. Поправьте меня, если я не прав (особенно буду признателен за примеры «неуместности» РНР в эээ… коде).
                                                0
                                                >Да, более многословно, с бóльшим геморроем — но можно.
                                                ключевая фраза. спрашивается, а зачем?
                                                пикрелэйтед, ага lurkmore.ru/images/2/21/Linux_doma.jpg
                                              0
                                              Python значительно более выразительный и логически выдержанный язык нежели PHP.
                                              И в нём постарались избежать явно выраженных проблем с производительностью.
                                              К примеру в Питоне различаются по внутреннему устройству, например,
                                              tuple: (1,2,3,4,) и list: [1,2,3,4,] — первый immutable и поэтому иногда более эффективен.

                                              В Питоне более эффективней, чем в ПХП реализован hash. Так как в ПХП хочешь не хочешь поддерживается последовательность ключей, а в Питоне есть варианты.

                                              Еще одна интересная особенность — это генераторы, советую почитать про них, если действительно интересно могу найти ссылку на pdf. Только читать надо не поверхностно, а разбирать примеры. Иначе не понятно в чём прикол.

                                              Простые примерчики:

                                              [ (a,a*a) for a in (1,2,3,4) if a != 2 ]
                                              результат [(1, 1), (3, 9), (4, 16)]
                                              смысл в том, что конструктор списка выполняется в Си коде, в отличие от
                                              общепринятого интерпретируемого for a in (1,2,3,4) {… }

                                              а вот еще интересный момент (генератор)

                                              i = ( (a,a*a) for a in (1,2,3,4) if a != 2 )

                                              >>> i.next()
                                              (1, 1)
                                              >>> i.next()
                                              (3, 9)
                                              >>> i.next()
                                              (4, 16)
                                              >>>

                                              Это тоже, что выше. НО! Генератор i хранит в себе стейт и начинает выполняться _только_ при первом next().
                                              такого рода вещи позволяют записывать алгоритмы очень компактно и эффективно.
                                              +2
                                              Да — движки надо писать на языке компилируемом в машинный код. В том числе с ассемблерными вставками
                                                0
                                                скажите это разработчикам eve-online

                                                и я говорил не про вставки. движок это многоуровневая штука, внизу работа с железом, над ней directx/opengl, еще выше ваш фреймворк, а над ним логика. на каждом уровне неизбежная потеря производительности. и движком называется все это вцелом, а не только то, что внизу.
                                                забавно, да?
                                                  0
                                                  eve мне всегда приводят в пример в этом случае =)
                                                  Про движок — забавно да, но это не отменят моего мнения, что все это надо писать на компилируемом языке. Да — бывает лень и хочется чего то типа
                                                  i = ( (a,a*a) for a in (1,2,3,4) if a != 2 )

                                                  а приходится вручную выделять память под массивы и гонять обычные циклы с индексом.
                                                    0
                                                    в том-то и дело )
                                                    функционал, у которого критична производительность, естественно надо решать на си и т.д… но на определенном уровне становится критичной не скорость работы кода, а скорость разработки, отсутствие длительных компиляций, легкость изменения, отладки, поддержки кода и прочее. я бы с радостью писал все на си, но если одна вещь пишется на си за полгода с огромными усилиями, а другая за месяц-другой с удовольствием, и при этом потеря в скорости несколько процентов, — выбор очевиден.
                                                      0
                                                      Согласен. Сравнение «полгода» и «месяц-другой» не в пользу первого. Но мне кажется это крайности. Тем более Вы предлагаете писать так не критичные к скорости части. Как правило все подразумевают под этим GUI. Давайте возьмем Delphi и Python. Я даже не буду утверждать, что на Delphi все сделать быстрее. Но я буду утверждать, что на Delphi это сделать не медленнее. При том что Delphi — компилируемый язык. Там нет длительных компиляций, там замечательный отладчик. Поддержка кода? Что по мне так разбираться в обычных array, for и if проще, чем в этом «i = ( (a,a*a) for a in (1,2,3,4) if a != 2 )».
                                                      Зачем Питон на десктопе? ;-)
                                                        0
                                                        дельфи, омг…
                                                        ох ну кроссплатформенность, хотя бы, про язык промолчу…
                                                        а на питоне вас никто не заставляет писать несколько строчек в одну, кашу легко в нагородить на любом языке.
                                                          0
                                                          О, для Вас писать на Delphi — это «ОМГ». Прекрасно. Тогда Вы можете понять мои чувства, когда мне предлагают писать на питоне под десктоп. =)

                                                          Кроссплатформенность. Если это действительно кому-то надо, то можно найти средства компилить паскаль и под линукс.

                                                          Ладно — давайте заканчивать это оффтопик.
                                                          0
                                                          Кстати, а интересный вопрос — что такое десктоп?

                                                          У меня из приложений сейчас самое популярное — Firefox,
                                                          Среда разработчика — Eclipse,
                                                          Еще бывает — Gimp и Picasa,
                                                          Кроме этого примочки от Gnome — терминал, часы, иконки.

                                                          Если брать это, как готовую платформу, то что сюда дописывать на Си?
                                                            0
                                                            Десктоп — то что выполняется у вас локально. Все что Вы перечислили -десктоп. Не десктоп — это то, что выполняется на Web-сервере.

                                                            Что дописывать? Вас все устраивает? Ну и прекрасно — ничего не надо дописывать.
                                                            Меня не устраивает тормознутость фокса и эклайпса — я нашел им замену, и меня тоже все устраивает.

                                                            Спасибо за диалог. Всего доброго.
                                          –1
                                          Релейтед пик вин :)
                                            +1
                                            Какие возможности у этой библиотеки? Какие грабли? Можно ли использовать в реальных проектах?

                                            Only users with full accounts can post comments. Log in, please.