话不多说,分别贴上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)
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)
解决方案 »
- 请问支付宝接口能否实现延时到账功能
- 如何使用和操作内存表
- SQL2000出现SSL安全错误的问题,谁能帮解决~?
- MdiBasic
- C#的运算符重载的小小问题...
- JAVA有没有象C#的ISSUEVISION和TSKVISION这样的微软直接提供的带源代码的大型例程
- session时间问题 谢谢大家
- 高手请进,如何得到字符串的首地址,加急!!!!!!!!!!!!!!!!
- 我是菜鸟哈!我问一下各位高手,一般c#入门应该看些什么书好呢???
- 思归,你可能误导了我!
- 如何释放Activator.CreateInstance调用非托管dll的资源
- 升级到 .NET 4.6以上之后bin目录下多出一大堆dll
我是在同一机器上跑的。C#的比python的慢3倍左右
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();
第一次:先运行C#,在运行python
第二次:先运行python,在运行C#
第三次:先运行python,在运行C#
我都是用的vs2017运行,导致的。
可能,我只是说可能vs对运行C#更有帮助和优势。
直接用楼主提供的代码=。= 多次测定 拿了个稳定值
一个是用的core2.2 一个是 4.7
另外,你两段代码的的计时应该把打印部分排除掉
因为显示可能比较占时间,而这个是不能体现运行速度的
用stringBuilder暂存,最后一次性输出
2、Release编译,不附加调试器运行你用VC再写一个,直接F5,结果会更加让你怀疑人生。
C++ debug、附加调试器 和 release、无调试器天差地别……
用何种语言 看客户需求与场景。取长补短 才是大家。
楼主的原始代码在我机器上运行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有多慢。