Информация об изменениях

Сообщение Re[10]: MS забило на дотнет. Питону - да, сишарпу - нет? от 05.09.2021 7:08

Изменено 05.09.2021 7:54 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() реально хорошее нововведение — когда я работал на шарпе подобные вещи куда сложнее писать было. Но формально Пайтон всеравно лаконичнее — даже после класса-однострочника. В простых проектах в одно рыло, типизация не нужна совсем — по крайней мере мне она ничем не помогает. Читабельность подобных пайтоновских конструкций не уступает шарповским — при наличии привычки. Но для сложных и коммандных проектов шарп явно способен что-то предложить.



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 реально хорошие нововведения — когда я работал на шарпе подобные вещи куда сложнее писать было. Но формально Пайтон всеравно лаконичнее — даже после класса-однострочника. В простых проектах в одно рыло, типизация не нужна совсем — по крайней мере мне она ничем не помогает. Читабельность подобных пайтоновских конструкций не уступает шарповским — при наличии привычки. Но для сложных и коммандных проектов шарп явно способен что-то предложить.



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>Пределов возможностей шарп не знает никто .

Это, похоже, правда