Сообщение Re[10]: MS забило на дотнет. Питону - да, сишарпу - нет? от 05.09.2021 7:08
Изменено 05.09.2021 8:04 vfedosov
Re[10]: MS забило на дотнет. Питону - да, сишарпу - нет?
S>var names2data = new Dictionary<string, (int, int, string)>() {["name1"]= (1, 3, "str1"), ["name2"] = (2, 4, "str2")};
S>var data2names = (from d in names2data select (d.Value.Item2, d.Key)).ToDictionary((t)=>t.Item1, (t)=>t.Key);
ну ToDictionary() и tuple реально хорошие нововведения — когда я работал на шарпе подобные вещи куда сложнее писать было. Но формально Пайтон всеравно лаконичнее — даже после класса-однострочника. Причем, это старый синтаксис Пайтона — для версий 2.x работает. В простых проектах в одно рыло, типизация не нужна совсем — по крайней мере мне она ничем не помогает. Читабельность подобных пайтоновских конструкций не уступает шарповским — при наличии привычки. Но для сложных и коммандных проектов шарп явно способен что-то предложить.
V>>Это ты написал для одномерного массива. Для двумерного это будет сложнее — как раз раза в 3, чем код на пайтоне.
S>Нет, я написал для двумерного.
Ну я попытался на своей VS2013 (более новые версии не доступны в нашей конторе) скомпилять следующий код:
ошибка: Error 1 Could not find an implementation of the query pattern for source type 'double[*,*]'. 'Select' not found. Are you missing a reference or a using directive for 'System.Linq'? c:\users\vfedosov\documents\visual studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs 30 34 ConsoleApplication2
для одномерного массива вполне компиляется:
Чего я и ожидал собственно. Или в новых версия .Net есть "implementation of the query pattern for source type 'double[*,*]'" ?
Далее я сделал тест производительности — для одномерного массива. Код на шарпе:
вирульный метод введен, чтобы компилятор не попытался оптимизировать ненужный рассчет. Данный код в релизе выполняется более 20 секунд на моем ноуте.
Аналогичный код на Пайтон:
выполняется вдвое быстрее даже без компиляции в exe. А нативный код — С++, который делает ту-же работу, выполняется в 5 раз быстрее. В принципе результат шарпа все равно лучше, чем я ожидал — Linq действительно работает более оптимально, чем я ожидал и умудряется избежать какой-то части лишних действий. Но Пайтон быстрее.
S>Пределов возможностей шарп не знает никто .
Это, похоже, правда
S>var data2names = (from d in names2data select (d.Value.Item2, d.Key)).ToDictionary((t)=>t.Item1, (t)=>t.Key);
ну ToDictionary() и tuple реально хорошие нововведения — когда я работал на шарпе подобные вещи куда сложнее писать было. Но формально Пайтон всеравно лаконичнее — даже после класса-однострочника. Причем, это старый синтаксис Пайтона — для версий 2.x работает. В простых проектах в одно рыло, типизация не нужна совсем — по крайней мере мне она ничем не помогает. Читабельность подобных пайтоновских конструкций не уступает шарповским — при наличии привычки. Но для сложных и коммандных проектов шарп явно способен что-то предложить.
V>>Это ты написал для одномерного массива. Для двумерного это будет сложнее — как раз раза в 3, чем код на пайтоне.
S>Нет, я написал для двумерного.
Ну я попытался на своей VS2013 (более новые версии не доступны в нашей конторе) скомпилять следующий код:
static void test()
{
var array2d = new double[1000, 1000];
array2d = (from a in array2d select Math.Min(a * 1.5, 1.0)).ToArray();
}
ошибка: Error 1 Could not find an implementation of the query pattern for source type 'double[*,*]'. 'Select' not found. Are you missing a reference or a using directive for 'System.Linq'? c:\users\vfedosov\documents\visual studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs 30 34 ConsoleApplication2
для одномерного массива вполне компиляется:
static void test()
{
var array2d = new double[1000000];
array2d = (from a in array2d select Math.Min(a * 1.5, 1.0)).ToArray();
}
Чего я и ожидал собственно. Или в новых версия .Net есть "implementation of the query pattern for source type 'double[*,*]'" ?
Далее я сделал тест производительности — для одномерного массива. Код на шарпе:
class Program
{
public virtual double[] multiply(double[] array2d)
{
array2d = (from a in array2d select Math.Min(a * 1.5, 1.0)).ToArray();
return array2d;
}
static void Main(string[] args)
{
Program p = new Program();
var array2d = new double[1000000];
for (int i = 0; i < 1000; ++i)
array2d = p.multiply(array2d);
}
вирульный метод введен, чтобы компилятор не попытался оптимизировать ненужный рассчет. Данный код в релизе выполняется более 20 секунд на моем ноуте.
Аналогичный код на Пайтон:
def multiply(arr):
arr = np.minimum(arr*1.5, 1.0)
return arr
array1D = np.ones([1000000], dtype=float)
for i in range(1000):
array1D = multiply(array1D)
выполняется вдвое быстрее даже без компиляции в exe. А нативный код — С++, который делает ту-же работу, выполняется в 5 раз быстрее. В принципе результат шарпа все равно лучше, чем я ожидал — Linq действительно работает более оптимально, чем я ожидал и умудряется избежать какой-то части лишних действий. Но Пайтон быстрее.
S>Пределов возможностей шарп не знает никто .
Это, похоже, правда
Re[10]: MS забило на дотнет. Питону - да, сишарпу - нет?
S>var names2data = new Dictionary<string, (int, int, string)>() {["name1"]= (1, 3, "str1"), ["name2"] = (2, 4, "str2")};
S>var data2names = (from d in names2data select (d.Value.Item2, d.Key)).ToDictionary((t)=>t.Item1, (t)=>t.Key);
ну ToDictionary() и tuple реально хорошие нововведения — когда я работал на шарпе подобные вещи куда сложнее писать было. Но формально Пайтон всеравно лаконичнее — даже после класса-однострочника. Причем, это старый синтаксис Пайтона — для версий 2.x работает. В простых проектах в одно рыло, типизация не нужна совсем — по крайней мере мне она ничем не помогает. Читабельность подобных пайтоновских конструкций не уступает шарповским — при наличии привычки. Но для сложных и коммандных проектов шарп явно способен что-то предложить.
V>>Это ты написал для одномерного массива. Для двумерного это будет сложнее — как раз раза в 3, чем код на пайтоне.
S>Нет, я написал для двумерного.
Ну я попытался на своей VS2013 (более новые версии не доступны в нашей конторе) скомпилять следующий код:
ошибка: Error 1 Could not find an implementation of the query pattern for source type 'double[*,*]'. 'Select' not found. Are you missing a reference or a using directive for 'System.Linq'? c:\users\vfedosov\documents\visual studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs 30 34 ConsoleApplication2
для одномерного массива вполне компиляется:
Чего я и ожидал собственно. Или в новых версия .Net есть "implementation of the query pattern for source type 'double[*,*]'" ? И если есть, то что будет на выходе ToArray() в этом случае? Одномерный массив?
Далее я сделал тест производительности — для одномерного массива. Код на шарпе:
вирульный метод введен, чтобы компилятор не попытался оптимизировать ненужный рассчет. Данный код в релизе выполняется более 20 секунд на моем ноуте.
Аналогичный код на Пайтон:
выполняется вдвое быстрее даже без компиляции в exe. А нативный код — С++, который делает ту-же работу, выполняется в 5 раз быстрее. В принципе результат шарпа все равно лучше, чем я ожидал — Linq действительно работает более оптимально, чем я ожидал и умудряется избежать какой-то части лишних действий. Но Пайтон быстрее.
S>Пределов возможностей шарп не знает никто .
Это, похоже, правда
S>var data2names = (from d in names2data select (d.Value.Item2, d.Key)).ToDictionary((t)=>t.Item1, (t)=>t.Key);
ну ToDictionary() и tuple реально хорошие нововведения — когда я работал на шарпе подобные вещи куда сложнее писать было. Но формально Пайтон всеравно лаконичнее — даже после класса-однострочника. Причем, это старый синтаксис Пайтона — для версий 2.x работает. В простых проектах в одно рыло, типизация не нужна совсем — по крайней мере мне она ничем не помогает. Читабельность подобных пайтоновских конструкций не уступает шарповским — при наличии привычки. Но для сложных и коммандных проектов шарп явно способен что-то предложить.
V>>Это ты написал для одномерного массива. Для двумерного это будет сложнее — как раз раза в 3, чем код на пайтоне.
S>Нет, я написал для двумерного.
Ну я попытался на своей VS2013 (более новые версии не доступны в нашей конторе) скомпилять следующий код:
static void test()
{
var array2d = new double[1000, 1000];
array2d = (from a in array2d select Math.Min(a * 1.5, 1.0)).ToArray();
}
ошибка: Error 1 Could not find an implementation of the query pattern for source type 'double[*,*]'. 'Select' not found. Are you missing a reference or a using directive for 'System.Linq'? c:\users\vfedosov\documents\visual studio 2013\Projects\ConsoleApplication2\ConsoleApplication2\Program.cs 30 34 ConsoleApplication2
для одномерного массива вполне компиляется:
static void test()
{
var array2d = new double[1000000];
array2d = (from a in array2d select Math.Min(a * 1.5, 1.0)).ToArray();
}
Чего я и ожидал собственно. Или в новых версия .Net есть "implementation of the query pattern for source type 'double[*,*]'" ? И если есть, то что будет на выходе ToArray() в этом случае? Одномерный массив?
Далее я сделал тест производительности — для одномерного массива. Код на шарпе:
class Program
{
public virtual double[] multiply(double[] array2d)
{
array2d = (from a in array2d select Math.Min(a * 1.5, 1.0)).ToArray();
return array2d;
}
static void Main(string[] args)
{
Program p = new Program();
var array2d = new double[1000000];
for (int i = 0; i < 1000; ++i)
array2d = p.multiply(array2d);
}
вирульный метод введен, чтобы компилятор не попытался оптимизировать ненужный рассчет. Данный код в релизе выполняется более 20 секунд на моем ноуте.
Аналогичный код на Пайтон:
def multiply(arr):
arr = np.minimum(arr*1.5, 1.0)
return arr
array1D = np.ones([1000000], dtype=float)
for i in range(1000):
array1D = multiply(array1D)
выполняется вдвое быстрее даже без компиляции в exe. А нативный код — С++, который делает ту-же работу, выполняется в 5 раз быстрее. В принципе результат шарпа все равно лучше, чем я ожидал — Linq действительно работает более оптимально, чем я ожидал и умудряется избежать какой-то части лишних действий. Но Пайтон быстрее.
S>Пределов возможностей шарп не знает никто .
Это, похоже, правда