Оптимизация кода Python

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

Хотя, на первый взгляд кажется, что Python и быстрый код не совместимые понятия, это не совсем правда.

Все тесты проводились на Python 3.3.3 и, само собой, не обошлось без IPython, который ну просто killer-feature этого языка. Continue reading

Pip, update all

Хотелось бы, да? А нету. Нашлось вот такое решение:

import pip
import sys
from subprocess import call

def pip_ver():
    if sys.version_info.major == 3:
        return "pip3"
    else:
        return "pip"

cmd_line = pip_ver() + " install --upgrade "

for dist in pip.get_installed_distributions():
    call(cmd_line + dist.project_name, shell=True)

Использовать просто:

python script_name.py

Делать файл исполнимым не стал, т.к. при явном вызове Python можно указать нужную версию 2.X или 3.X

Явное удаление функций в C++11

Думаю что все помнят что в C++03 для того, что бы сделать какой-либо класс защищенным от копирования было необходимо объявить его конструктор копирования и защищенными.

class Foo {
public:
    Foo(){}
    ~Foo(){}
private:
    Foo(const Foo&);
    Foo& operator=(const Foo&);
};

Continue reading

Make && 10.9

В 10.9 подложили неожиданную пакость. Make внезапно стал запускаться с дополнительной выставленной переменной окружения следующего вида: SDKROOT=/. А так как у нас есть своя, довольно развесистая логика определения используемой SDK, она, конечно же, развалилась.
Микро Makefile:

$(info $(shell env))

И если напустить на него make в консоли получим приблизительно следующее:

... _=/usr/bin/make SDKROOT=/

WTF?!

Список языков и его обработка

Я вот подумал: представление языков в виде дерева не очень удобно, т.к. с поиском вхождения того или иного языка в список начинаются проблемы. Поэтому, довольно логичным шагом стало преобразовать список в первую нормальную форму, с ней будет работать проще всего. Текущий вид списка:

langs_info[:1]

Continue reading

Парсинг Wikipedia

Недавно с удивлением узнал о том, что Wikipedia – это не только ценный мех отличный источник информации, но еще и очень приличное API для доступа к этой самой отличной информации. Ну а там, где есть какое-то API, почти наверняка найдется Python библиотека к нему.

А вообще, затеял я все это дело ради того, что бы загрузить список языков программирования с Wikipedia и получить немного дополнительной информации по ним. Что удивительно, полностью подходящей мне библиотеки не нашлось, и пришлось писать небольшой патчик к библиотеки Wikipedia, благо на Python код пишется очень быстро. В примерах используется та версия, что лежит у меня на GitHub. Это вызвано тем, что мои изменения в основном репозитории библиотеки Wikipedia несколько видоизменили и теперь результат новых функций выглядит более читабельным, но бесполезным в моем случае, т.к. возвращает отформатированный текст, а не Markdown. Continue reading

Получение сертификатов сайта

Практически любая, сколь-нибудь не стандартная задача выливается в часы малопродуктивного гугления, что печалит. Сегодня я искал ответ на вопрос, как в OSX получить сертификаты сайта, с которым ты планируешь общаться по HTTPS. До кучи дело осложняется тем, что все должно работать не только напрямую, но и через прокси.
Если говорить о Windows, данная задача решается довольно просто, благодаря библиотеке WinHTTP (кажется, ее так звать) и функции WinHttpQueryOption с флагом WINHTTP_OPTION_SERVER_CERT_CONTEXT, но мне-то нужно решение для OSX! И оно было найдено, как и ожидалось, в дебрях очень любимой мной библиотеки cURL. Continue reading

DateTime и Pandas

В составе модуля Pandas есть очень удобный функционал для чтения CSV-файлов. К сожалению, большинство примеров работы с ним предполагают что одна физическая колонка в CSV-файле соответствует одной логической записи в DataFrame. Предположение отличное, но я сходу наткнулся на то, что дата разнесена по нескольким столбцам, а не записана в формате типа YYYY/MM/DD:

data = """\
    2011,1,10,AAPL,Buy,1500,
    2011,1,13,AAPL,Sell,1500,
    2011,1,13,IBM,Buy,4000,
    """

Примитивные решения со считыванием в существующем формате с последующей конверсией или построчным чтением с преобразованием, пусть и подходили для моего случая, но выглядели очень уж “не спортивно”, посему были отброшены сразу. И это было верно, так как правильное решение оказалось очень простым и элегантным:

import pandas.io.parsers as pp
from cStringIO import StringIO

pp.read_csv(StringIO(data), names=["year", "month", "day", "symbol", "op", "count", "NA"],
                           parse_dates={'date':["year", "month", "day"]})

Что даст нам правильно представленные данные:

                 date symbol    op  count  NA
0 2011-01-10 00:00:00   AAPL   Buy   1500 NaN
1 2011-01-13 00:00:00   AAPL  Sell   1500 NaN
2 2011-01-13 00:00:00    IBM   Buy   4000 NaN

Итераторы в Rust

Реализация итераторов в Rust вышла довольно удобная, да и сама коллекция доступных итераторов обширна и вполне сравнима с коллекцией итераторов из библиотеки BOOST.

let mut xs = ~[1, 2, 3];
{
    let it = xs.iter();  // (1)
    //xs.push(4);        // (2)
}

Continue reading