Я хочу протестировать несколько реализаций одной и той же проблемы. Например, у меня есть проблема / часть кода «X» с реализацией «X1» и «X2» и проблема «Y» с реализацией «Y1», «Y2» и «Y3». Думайте о них как о небольших 10-строчных функциях с немного разными кодами внутри. Могу ли я каким-то образом использовать git для переключения между этими реализациями, чтобы заменить соответствующие строки кода? Я думал о ветвлении, но не знаю, как это применить. Я хотел бы переключаться между каждой реализацией одной проблемы с любой комбинацией проблем. (Итак, «X1» с «Y2», затем «X2» с «Y1» и т. Д.) Затем я хотел бы измерить производительность и выбрать окончательную реализацию для использования. Могу ли я использовать git для этого?

5
Semmu 12 Май 2014 в 16:38

2 ответа

Лучший ответ

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

Однако git на самом деле хорошо подходит для «подкачки кода», поэтому вы можете, например, протестировать различные реализации, подобные этой:

$ git init .
$ git checkout -b  impl1
$ cat << EOF > main.py
> print "implementation1"
> EOF
$ git add -A && git commit -m "Implementation 1"
$ git checkout -b master  ## You can probably skip this ...
$ git checkout -b impl2
$ rm main.py && cat << EOF > main.py
> print "implementation2"
> EOF
$ git add -A && git commit -m "Implementation 2"

Теперь вы можете переключаться между реализациями следующим образом:

$ git checkout impl1
$ git checkout impl2

И протестируйте их производительность или что-то еще друг против друга:

$ git checkout impl1 && time python main.py
Switched to branch 'impl1'
implementation1
python main.py  0,02s user 0,01s system 77% cpu 0,040 total

$ git checkout impl2 && time python main.py
Switched to branch 'impl2'
implementation2
python main.py  0,02s user 0,01s system 91% cpu 0,034 total

Вроде все нормально, print печатает разные строки примерно одинаково :)

3
logc 12 Май 2014 в 12:57

На самом деле я делаю это как часть развертывания сценария EMR для задач машинного обучения, выполняемых в Spark. У меня есть сценарий, который запускает кластер, проверяет код и запускает ветку как часть эксперимента. Затем результаты сохраняются в базе данных. Очень просто.

Чтобы быть более конкретным, один эксперимент может проверять, должен ли определенный этап конвейера идти до или после другого, или, возможно, его полностью исключить (на самом деле A / B / C-тест). Конечно, это можно сделать с помощью оператора switch / if / else внутри кода, но приятная часть этого заключается в том, насколько легко будет выбрать наиболее эффективную ветвь и объединить ее с производственной ветвью, а также дополнительное преимущество возможность запускать несколько кластеров параллельно и запускать A / B / C / и т. д. одновременно без особых усилий.

0
Evan Zamir 28 Сен 2016 в 17:55