话不多说,分别贴上2段程序,可直接运行
int size = 30;
            
            int[,] array = new int[size, size];            int orient = 0;
            int j = 0;
            int k = 0;
 
            DateTime starttime = DateTime.Now;            for (int i = 1; i < size * size - 1; i++)
            {
                array[j,k] = i;                if (j + k == size - 1)
                {
                    if (j > k)
                    {
                        orient = 1;
                    }
                    else
                    {
                        orient = 2;
                    }
                }
                else if (k == j && k >= size / 2)
                {
                    orient = 3;
                }
                else if (j == k - 1 && k <= size / 2)
                {
                    orient = 0;
                }                if (orient == 0)
                {
                    j += 1;
                }
                else if (orient == 1)
                {
                    k += 1;
                }
                else if (orient == 2)
                {
                    k -= 1;
                }
                else
                {
                    j -= 1;
                }            }            for (int i = 0; i < size; i++)
            {
                for (int m = 0; m < size; m++)
                {
                    Console.Write(string.Format("{0:D3} ", array[i, m]));
                }
                Console.Write("\r\n");
            }            DateTime enddate = DateTime.Now;            Console.WriteLine("共用时:" + enddate.Subtract(starttime).Milliseconds);            Console.ReadKey();python的import datetime
starttime = datetime.datetime.now()
#print("开始时间为:%f",ticks)SIZE = 30
array = [[0]  * SIZE]
# 创建一个长度SIZE * SIZE的二维列表
for i in range(SIZE - 1):
    array += [[0] * SIZE]
# 该orient代表绕圈的方向
# 其中0代表向下,1代表向右,2代表向左,3代表向上
orient = 0
# 控制将1~SIZE * SIZE的数值填入二维列表中
# 其中j控制行索引,k控制列索引
j = 0
k = 0
for i in range(1, SIZE * SIZE + 1) :
    array[j][k] = i
    # 如果位于图4.2中①号转弯线上
    if j + k == SIZE - 1 :
        # j>k,位于左下角
        if j > k :
            orient = 1
        # 位于右上角
        else :
            orient = 2
    # 如果位于图5.2中②号转弯线上
    elif (k == j) and (k >= SIZE / 2) :
        orient = 3
    # 如果j位于图5.2中③号转弯线上
    elif (j == k - 1) and (k <= SIZE / 2) :
        orient = 0
    # 根据方向来控制行索引、列索引的改变
    # 如果方向为向下绕圈
    if orient == 0 :
        j += 1
    # 如果方向为向右绕圈
    elif orient == 1:
        k += 1
    # 如果方向为向左绕圈
    elif orient == 2:
        k -= 1
    # 如果方向为向上绕圈
    elif orient == 3:
        j -= 1
# 采用遍历输出上面的二维列表
for i in range(SIZE) :
    for j in range(SIZE) :
        print('%03d ' % array[i][j], end = "")
    print("")endtime = datetime.datetime.now()
print("用时为:" ,(endtime - starttime).microseconds/1000)      

解决方案 »

  1.   

    欢迎大家讨论,看看C#的有啥优化没。
    我是在同一机器上跑的。C#的比python的慢3倍左右
      

  2.   


                int size = 30;            int[,] array = new int[size, size];            int orient = 0;
                int j = 0;
                int k = 0;            var stopwatch = Stopwatch.StartNew();
                for (int i = 1; i < size * size - 1; i++)
                {
                    array[j, k] = i;                if (j + k == size - 1)
                    {
                        if (j > k)
                        {
                            orient = 1;
                        }
                        else
                        {
                            orient = 2;
                        }
                    }
                    else if (k == j && k >= size / 2)
                    {
                        orient = 3;
                    }
                    else if (j == k - 1 && k <= size / 2)
                    {
                        orient = 0;
                    }                if (orient == 0)
                    {
                        j += 1;
                    }
                    else if (orient == 1)
                    {
                        k += 1;
                    }
                    else if (orient == 2)
                    {
                        k -= 1;
                    }
                    else
                    {
                        j -= 1;
                    }
                }            var stringBuilder = new StringBuilder(4096);
                for (int i = 0; i < size; i++)
                {
                    for (int m = 0; m < size; m++)
                    {
                        stringBuilder.Append($"{array[i, m].ToString("D3")} ");
                    }
                    stringBuilder.AppendLine();
                }
                Console.WriteLine(stringBuilder.ToString());            stopwatch.Stop();
                Console.WriteLine("共用时:" + stopwatch.Elapsed.TotalMilliseconds);            Console.ReadKey();
      

  3.   

    你是不是把第一次启动程序,jit翻译的时间算进去了
      

  4.   

    我运行了3次的结果:C#略快。
    第一次:先运行C#,在运行python
    第二次:先运行python,在运行C#
    第三次:先运行python,在运行C#
      

  5.   

    不过,这个结果也可能是。
    我都是用的vs2017运行,导致的。
    可能,我只是说可能vs对运行C#更有帮助和优势。
      

  6.   


    直接用楼主提供的代码=。= 多次测定 拿了个稳定值
    一个是用的core2.2   一个是 4.7
      

  7.   

    c#肯定要比python快上很多很多
    另外,你两段代码的的计时应该把打印部分排除掉
    因为显示可能比较占时间,而这个是不能体现运行速度的
      

  8.   

    你这个计时用的函数明显有问题,C#用Stopwatch,python用time
      

  9.   

    cs比vb.net都要慢
      

  10.   

    没有试过python,感觉c#已经很不错了
      

  11.   

    C#慢是慢在console的输出上面。用三楼的程序。就秒杀python了
    用stringBuilder暂存,最后一次性输出
      

  12.   

    python的代码真难看
      

  13.   

    1、掐掉输出部分
    2、Release编译,不附加调试器运行你用VC再写一个,直接F5,结果会更加让你怀疑人生。
    C++ debug、附加调试器 和 release、无调试器天差地别……
      

  14.   

    有可能吗?按道理来说 python大部分代码要比c++ java c#都慢
      

  15.   

    C# 比 Python 慢 那是不可能的编译解释性语言不可能比静态语言快虽然C# 现在情况不太好,但是微软这点技术还是有的
      

  16.   

    c#的代码运行怎么可能比python慢
      

  17.   

    python是用c写的,相比于python,c可以更加直接的转换机器码(个人理解),python虽然慢但它可以直接调用c等来弥补
      

  18.   

    看到Python火了 就处处看不起C# 质疑C#?
    用何种语言 看客户需求与场景。取长补短 才是大家。
      

  19.   

    C#主要慢在Console.Write上。
    楼主的原始代码在我机器上运行40-50之间
    int size = 30;            int[,] array = new int[size, size];            int orient = 0;
                int j = 0;
                int k = 0;            DateTime starttime = DateTime.Now;
                int iSize = size * size - 1;
                for (int i = 1; i < iSize ; i++)
                {
                    array[j, k] = i;                if (j + k == size - 1)
                    {
                        if (j > k)
                        {
                            orient = 1;
                        }
                        else
                        {
                            orient = 2;
                        }
                    }
                    else if (k == j && k >= size / 2)
                    {
                        orient = 3;
                    }
                    else if (j == k - 1 && k <= size / 2)
                    {
                        orient = 0;
                    }                if (orient == 0)
                    {
                        j += 1;
                    }
                    else if (orient == 1)
                    {
                        k += 1;
                    }
                    else if (orient == 2)
                    {
                        k -= 1;
                    }
                    else
                    {
                        j -= 1;
                    }            }
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < size; i++)
                {
                    for (int m = 0; m < size; m++)
                    {
                        sb.Append(string.Format("{0:D3} ", array[i, m]));
                        //Console.Write(string.Format("{0:D3} ", array[i, m]));
                    }
                    sb.AppendLine();
                    //Console.Write("\r\n");
                }
                Console.Write(sb.ToString());            DateTime enddate = DateTime.Now;
                //Console.Write(sb.ToString());            Console.WriteLine("共用时:" + enddate.Subtract(starttime).Milliseconds);            Console.ReadKey();
    这样的速度是4-6,
    如果把
    Console.Write(sb.ToString());            DateTime enddate = DateTime.Now;
    这两行代码对调,使得时间计算不考虑 Console.Write 的话,5次结果都是0。可见这个Console.Write有多慢。
      

  20.   

    .net真的是编译型语言吗