話不多說,分別貼上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)
uj5u.com熱心網友回復:
歡迎大家討論,看看C#的有啥優化沒。我是在同一機器上跑的。C#的比python的慢3倍左右
uj5u.com熱心網友回復:
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();
uj5u.com熱心網友回復:
你是不是把第一次啟動程式,jit翻譯的時間算進去了uj5u.com熱心網友回復:
沒有。分別運行了N次的
uj5u.com熱心網友回復:
我運行了3次的結果:C#略快。。。。第一次:先運行C#,在運行python

第二次:先運行python,在運行C#

第三次:先運行python,在運行C#

uj5u.com熱心網友回復:
不過,這個結果也可能是。我都是用的vs2017運行,導致的。
可能,我只是說可能vs對運行C#更有幫助和優勢。
uj5u.com熱心網友回復:


直接用樓主提供的代碼=。= 多次測定 拿了個穩定值
一個是用的core2.2 一個是 4.7
uj5u.com熱心網友回復:
c#肯定要比python快上很多很多另外,你兩段代碼的的計時應該把列印部分排除掉
因為顯示可能比較占時間,而這個是不能體現運行速度的
uj5u.com熱心網友回復:
你這個計時用的函式明顯有問題,C#用Stopwatch,python用timeuj5u.com熱心網友回復:
這個列印部分會占一點時間。uj5u.com熱心網友回復:
厲害了大佬 我也想學習uj5u.com熱心網友回復:
cs比vb.net都要慢uj5u.com熱心網友回復:
這幾行代碼比較幾乎沒有啥意義uj5u.com熱心網友回復:
沒有試過python,感覺c#已經很不錯了uj5u.com熱心網友回復:
C#慢是慢在console的輸出上面。用三樓的程式。就秒殺python了用stringBuilder暫存,最后一次性輸出
uj5u.com熱心網友回復:
不對等比較,“秒殺”沒有意義~~~uj5u.com熱心網友回復:
python的代碼真難看uj5u.com熱心網友回復:
1、掐掉輸出部分2、Release編譯,不附加除錯器運行
你用VC再寫一個,直接F5,結果會更加讓你懷疑人生。
C++ debug、附加除錯器 和 release、無除錯器天差地別……
uj5u.com熱心網友回復:
有可能嗎?按道理來說 python大部分代碼要比c++ java c#都慢uj5u.com熱心網友回復:

C# 比 Python 慢 那是不可能的
編譯解釋性語言不可能比靜態語言快
雖然C# 現在情況不太好,但是微軟這點技識訓是有的
uj5u.com熱心網友回復:
c#的代碼運行怎么可能比python慢。。。uj5u.com熱心網友回復:
python是用c寫的,相比于python,c可以更加直接的轉換機器碼(個人理解),python雖然慢但它可以直接呼叫c等來彌補uj5u.com熱心網友回復:
看到Python火了 就處處看不起C# 質疑C#?用何種語言 看客戶需求與場景。取長補短 才是大家。
uj5u.com熱心網友回復:
C# 歷經這么多的版本,效率應該是很高的(1.0 版除外),樓主請注意:輸出陳述句執行時會消耗大量時間(因為要滾屏),不應將輸出陳述句計算在內;另外不要在除錯環境里比較,應編譯后獨立運行。uj5u.com熱心網友回復:
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有多慢。
uj5u.com熱心網友回復:
.net真的是編譯型語言嗎uj5u.com熱心網友回復:
哈哈哈 我也覺得
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/94804.html
標籤:C#
