macroevolution (
macroevolution) wrote2015-01-11 02:41 pm
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Посоветуйте язык программирования
Я всю жизнь программировал только на бейсике, на разных его версиях. Так получилось. Когда писал кандидатскую, набралось очень много таблиц с данными (это были морфологические признаки морских ежей), и я задолбался обсчитывать их на калькуляторе. Поэтому быстренько освоил бейсик (тогда персональные компьютеры IBM только начали появляться, и к ним прилагался язык GW-Basic). Освоил - и сразу почувствовал себя человеком. С тех пор не переучивался, сейчас пишу все свои программки на VBA в MS Access. То есть в программировании я дилетант, но опытный. Программированием пользуюсь сейчас для имитационного моделирования эволюционных процессов в популяциях. Подумываю об одной новой модели, но понимаю, что на VBA она будет работать невыносимо медленно. Насколько я понимаю, программа, написанная почти на любом другом языке, компилируемом, будет работать в разы быстрее. Вопрос такой: какой из этих языков мне будет быстрее и проще всего освоить? Времени, сил и желания преодолевать трудности и вникать в программистские проблемы - не имеется. Мне бы этот язык просто скачать (можно купить, если не слишком дорого), освоить за пару-тройку дней - и вперед. Т.е. главное, чтобы он был максимально простым в освоении для того, кто знает бейсик, без всяких интеллектуальных "понтов", но работал хотя бы раз в 10 быстрее.
no subject
Частично в этом вина автора - ключевую часть вопроса он никак не выделил, а, по моим наблюдениям, многие бросаются отвечать, прочитав лишь заголовок.
Я думаю, что цель надо обязательно вынести в заголовок, "Посоветуйте язык программирования для имитационного моделирования эволюционных процессов в популяциях".
И в первых строках обозначить претензии к текущему языку - медленный.
И принимать только те ответы, которые аргументированно учитывают указанные условия. Очень жаль, кстати, что пока не было ответов от людей, занимающихся подобными вычислениями.
Сам я, увы, не слишком компетентен в предлагаемых языках, но довольно компетентен в программировании вообще. И в этом смысле поддержу единственного комментатора, который попытался сначала выяснить - а что именно является основной причиной медленного исполнения? Такой процесс называется красивым словом "профайлинг" и должен, по-хорошему, предшествовать любым поискам инструмента. Никаких особенных инструментов для этого не требуется - возможно, хватит просто здравого смысла и пары экспериментов.
Так что, для начала надо разобраться - действительно ли это скорость работы самого языка а не скорость доступа к данным. Если второе, то можно либо сменить хранилище, либо попробовать оптимизировать работу текущего - к примеру, тупо добить памяти к рабочему компьютеру может оказаться самым простым решением.
Если же проблема действительно в количестве выполняемых вычислений, то я бы попробовал посоветовать C. Его базовый синтаксис довольно простой и похож на все другие ЯП, а по скорости он является безусловным чемпионом.
Ну, или я бы посмотрел на специализированные системы моделирования, такие, например как продукты http://www.wolfram.com/
no subject
От себя добавлю - может сменить компьютер - самое быстрое и дешевое.
И не слушайте про всякие там C# - охота засирать мозги на старости лет?
no subject
http://macroevolution.livejournal.com/186606.html?thread=12744174#t12744174
no subject
Простите заранее за экзотический подход.
no subject
Если основная тяжесть ложится на sql, и в этом случае Мysql не является все-таки, лидером по оптимизации. А уж язык, из которого с базой работать - и вовсе вторичен. Ну, и последний гвоздь - именно на богатых вычислениями задачах все тесты показывают РНР в хвосте. Так что, пожалуй, не тот случай.
no subject
Будет ноль ответов. Оно вряд ли надо автору.
no subject
Если БД по запросу возвращает ноль строк, это не значит, что запрос плохой. А просто нет данных. Отсутствие ответа ясно покажет, что приемлемой альтернативы нет, и стоит оставить привычное окружение.
no subject
no subject
вот именно
есть у меня нехорошее подозрение, что автор хранит промежуточные данные не в объявленных переменных/массивах/структурах данных (да, на VBA можно делать связные списки и деревья, настоящие), а в таблицах или в полях форм, например
надо сначала разбираться с этим, а то я сомневаюсь, что там такая молотилка, что время на обработку собственно вычислений имеет какое-то значение
no subject
А почему нет? Если популяция большая, и нужно просчитать сотни тысяч поколений... И сделать это сотню раз, чтобы оценить разброс результатов из-за случайностей...
То есть вычисления простые, но их тупо много.
no subject
Ну вот чисто ради смеха, запустил на VBA Excel такую задачу:
1) выделяем массив double(10000, 10000)
2) заполняем его случайными данными от 0 до 1
3) умножаем каждую ячейку на 9 соседних, с честной проверкой на края таблицы
4) крутим 2) и 3) 10 раз, чтобы оценить время на инициализацию массива
результаты (не очень чистые, т.к. я не снимал IE, торрент и прочую хрень):
однократный прогон ~ 83с,
10-кратный прогон ~ 827с.
Итого на инициализацию время почти не тратится, каждая итерация - полторы минуты.
Каждая итерация это, на минуточку, почти миллиард умножений с плавающей точкой на VB + заполнение массива на 100 млн. случайными числами + проверки и логика циклов.
У меня, конечно, не самая слабая машинка, но и не суперкомпьютер: i7 (860, 4 ядра), 2.8GH, 4GB, винты не SSD.
В общем, повторюсь, скорее всего надо просто исключить обращения к базе данных Access из итераций. Если же они там необходимы, то переход на C++ поможет, как мертвому припарки.
no subject
Visual Studio 2013. C++. Оптимизация на скорость О2. Prefer fast code.
Винда 7ка. Проц Intel® Core™2 Quad Processor Q8300 (4M Cache, 2.50 GHz) 8Gb Ram.
18 секунд
http://ic.pics.livejournal.com/guga50/10354015/1544/1544_900.jpg
мля ((((( ну в цикле b должно быть до 10ти... торопился. хрен с ним пусть 20 секунд.
no subject
и честные проверки делал на края массива, все 100 000 раз ;-)
все равно 40 раз - очень много, похоже, у меня XL начал свопиться, я же другие приложения не убрал
Надо бы проверить, что даст VB в Visual Studio.
В любом случае, если мы угадали сложность задачи, то выигрыш во времени не окупает изучения неспециалистом нового языка программирования, а проблема скорее всего в обращениях к db
no subject
ну хорошо. ща радн 10 раз закручу... но чёта мне подсказывает... :)))
УПД: ОХ! Ёпт! 41 секунда :((
вот такой вариант был:
double **a = new double*[10000];
for (int i = 0; i < 10000; i++)
a[i] = new double[10000];
srand((unsigned)time(NULL));
for (int b = 0; b < 10; b++){
for (int i = 0; i < 10000; i++)
for (int j = 0; j < 10000; j++)
a[i][j] = (double)rand() / RAND_MAX;
for (int i = 1; i < 9999; i++)
for (int j = 1; j < 9999; j++)
{
a[i][j] = a[i - 1][j - 1] *
a[i][j - 1] *
a[i + 1][j - 1] *
a[i - 1][j] *
a[i + 1][j] *
a[i - 1][j + 1] *
a[i][j + 1] *
a[i + 1][j + 1];
}
}
Но у меня и комп извините... по сравнению с вашим... мягко говоря... что как бэ тоже надо учитывать.
>> если мы угадали сложность задачи, то выигрыш во времени не окупает изучения неспециалистом нового языка программирования
а если не угадали, то вместо одной ночи расчётов человек будет ждать неделю, например...
no subject
я же не оптимизирую, а в лоб делаю проверки как школьник ;-)
комп - похоже, для этих параметров размер памяти важен, на 8 GB задача ложится в оперативку полностью, а у меня - легла бы, если бы я комп перезагрузил перед запуском XL
> а если не угадали, то вместо одной ночи расчётов человек будет ждать неделю, например...
гадание на кофейной гуще - наше все !
no subject
Начались в деревне танцы!!! :))) ОК! Вот с краевыми
double **a = new double*[10002];
for (int i = 0; i < 10001; i++)
a[i] = new double[10002];
srand((unsigned)time(NULL));
for (int b = 0; b < 10; b++){
for (int i = 0 i < 10001; i++)
a[0][i] = 1; a[i][0] = 1; a[10001][i] = 1; a[i][10001] = 1;
for (int i = 1; i < 10001; i++)
for (int j = 1 j < 10001; j++)
a[i][j] = (double)rand() / RAND_MAX;
for (int i = 1; i < 10001; i++)
for (int j = 1; j < 10001; j++)
a[i][j] = a[i - 1][j - 1] * a[i][j - 1] * a[i + 1][j - 1] * a[i - 1][j] *
a[i + 1][j] * a[i - 1][j + 1] * a[i][j + 1] * a[i + 1][j + 1];
}
Просто сделал окантовочку вокруг матрицы из единичек :))
Время если чо не поменялось :-р
>> я же не оптимизирую
я тоже. если по-уму, то для начала обсчёта следующей строки (ну если мы перебираем по горизонтали например) достаточно чтобы предыдущая строка ушла вперёд всего на 2 столбца и можно начинать обсчитывать.
Таким образом программа может распаралеливаться до нескольких тысяч трэдов.
Ну а дальше грузим этой работой ГПУ и получаем результат. Вот тут от железа будет ОЧЕНЬ зависеть. С моей видюхой с пассивным охлаждением и 64 ядрами задача будет решаться менее чем за секунду, а на вашем компе, мгновенно. (конечно надо смотреть чё там в функции РАНД и какая энтропия нам нужна. мож и не стоит так морочиться и запилить чёнить простенькое).
В любом случае есть подход экстенсивный (добавить памяти, купить мощнее) а есть интенсивный (мальца мозгом шевельнуть). Я за второе, хотя я вообще не программер, а теплотехник по образованию и всегда работал по профессии.
no subject
Но мы же не ставим задачу оптимизировать, мы хотим воспроизвести примерно, что считает хозяин журнала. Насколько я представляю себе имитационное моделирование, вычислительную сложность итерации мы скорее завысили, а число шагов не бывает очень большим - все существенное выявляется на первых десятках, а дальше начинает накапливаться мусор (если параметры не дискретные, конечно).
Параллельные вычисления - это сугубый оффтопик, хотя ... если автор считает что-то на больших сетках ... почему бы и нет.
RND в бейсиках - псевдослучайный, довольно паршивого качества. Там используется умножение на большое число с остатком, насколько я помню.
no subject
no subject
http://support.microsoft.com/kb/231847
no subject
(no subject)
(no subject)
no subject
Dim a(10000, 10000) As Double
Dim i, j, l As Long
Debug.Print "start", Time()
For l = 1 To 10
For i = 1 To 10000
For j = 1 To 10000
a(i, j) = Rnd()
Next j
Next i
For i = 1 To 10000
For j = 1 To 10000
If i <= 1 Then
If j <= 1 Then
a(i, j) = a(i, j)
ElseIf j >= 10000 Then
a(i, j) = a(i, j)
Else
a(i, j) = 1 * a(i, j - 1) * a(i, j) * a(i + 1, j + 1) * a(i + 1, j - 1) * a(i + 1, j) * a(i + 1, j + 1)
End If
ElseIf i <= 10000 Then
If j <= 1 Then
a(i, j) = a(i, j)
ElseIf j >= 10000 Then
a(i, j) = a(i, j)
Else
a(i, j) = a(i - 1, j - 1) * a(i - 1, j) * a(i - 1, j + 1) * a(i, j - 1) * a(i, j) * a(i, j + 1) * 1
End If
Else
If j <= 1 Then
a(i, j) = 1 * a(i - 1, j) * a(i - 1, j + 1) * 1 * a(i, j) * a(i + 1, j + 1) * 1 * a(i + 1, j) * a(i + 1, j + 1)
ElseIf j >= 10000 Then
a(i, j) = a(i - 1, j - 1) * a(i - 1, j) * 1 * a(i, j - 1) * a(i, j) * 1 * a(i + 1, j - 1) * a(i + 1, j) * 1
Else
a(i, j) = a(i - 1, j - 1) * a(i - 1, j) * a(i - 1, j + 1) * a(i, j - 1) * a(i, j) * a(i + 1, j + 1) * a(i + 1, j - 1) * a(i + 1, j) * a(i + 1, j + 1)
End If
End If
Next j
Next i
Next l
Debug.Print "end", Time()
End Sub
чорт, все отступы съело !
no subject
за это я Басик не люблю. бггг)))
no subject
http://macroevolution.livejournal.com/186606.html?thread=12744174#t12744174
no subject
---
basic в названии не должен вводить в заблуждение, потому что purebasic — си-подобный язык, что и написано в статье
no subject
Сравните скорость _безопасного_ программирования на условном С и условном Перле.
Зачем человеку геморрой в виде всех проблем с памятью, переполнением и т.п.?
Перл + ПДЛ или Питон с НамПи или Р с кондуктором - быстро для освоения, быстро для написания и быстро для исполнения.