.NET数组比IronPython中的列表慢?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了.NET数组比IronPython中的列表慢?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2405字,纯文字阅读大概需要4分钟。
内容图文
![.NET数组比IronPython中的列表慢?](/upload/InfoBanner/zyjiaocheng/653/86784b72299e4a75a3b95ad4e595e679.jpg)
我在IronPython中基于代码here做了以下矩阵乘法基准测试:
from System import Random
from System.Diagnostics import Stopwatch
def zero(m,n):
# Create zero matrix
new_matrix = [[0 for row in range(n)] for col in range(m)]
return new_matrix
def rand(m,n):
# Create random matrix
rnd = Random(1)
new_matrix = [[rnd.NextDouble() for row in range(n)] for col in range(m)]
return new_matrix
def show(matrix):
# Print out matrix
for col in matrix:
print col
def mult(matrix1,matrix2):
# Matrix multiplication
if len(matrix1[0]) != len(matrix2):
# Check matrix dimensions
print 'Matrices must be m*n and n*p to multiply!'
else:
# Multiply if correct dimensions
watch = Stopwatch()
print 'mult1 start....'
watch.Start()
new_matrix = zero(len(matrix1),len(matrix2[0]))
for i in range(len(matrix1)):
for j in range(len(matrix2[0])):
for k in range(len(matrix2)):
new_matrix[i][j] += matrix1[i][k]*matrix2[k][j]
watch.Stop()
print 'mult1 end.'
print watch.ElapsedMilliseconds
return new_matrix
from System import Array
def ListToArray(matrix):
n = len(matrix)
m = len(matrix[0])
a = Array.CreateInstance(float, n, m)
for i in range(n):
for j in range(m):
a[i,j] = matrix[i][j]
return a
def mult2(matrix1, matrix2):
N = len(matrix1)
K = len(matrix2)
M = len(matrix2[0])
m1 = ListToArray(matrix1)
m2 = ListToArray(matrix2)
res = ListToArray(rand(len(matrix1), len(matrix2[0])))
watch = Stopwatch()
print 'mult2 start...'
watch.Start()
for i in range(N):
for j in range(M):
for k in range(K):
res[i,j] += m1[i,k]*m2[k,j]
watch.Stop()
print 'mult2 ends.'
print watch.ElapsedMilliseconds
return res
if __name__ == '__main__':
#a = rand(280,10304)
#b = rand(10304,280)
a = rand(280,10)
b = rand(10,280)
c = mult2(a, b)
d = mult(a, b)
我想尝试两个大矩阵(280 x 10304和10304 x 208),但是两个版本都无法在短时间内产生结果.
然后我尝试了一个小得多的代码(如代码中所示),结果如下:
mult2 : 7902 ms
mult1 : 420 ms
表示在IronPython中使用.NET数组比python List慢得多.
还要注意,C#对这两个大矩阵使用了大约12秒的时间. IronPython已经在小10K倍的情况下花费了很多.我不确定计算机中的IronPython设置是否错误,如果不是,IronPython的数字代码真的很慢.
解决方法:
对于您的特定问题,我认为问题是boxing-在IronPython中,列表项(和所有其他变量)都用盒装存储,因此仅对盒装值进行操作.但是,没有对CLR数组元素进行装箱,因此,IronPython在从数组中提取它们时必须对它们进行装箱,然后在返回途中对它们进行装箱.C#可以对未装箱的值进行操作,并且还有很多其他优化功能使IronPython没有的数组变得更快.
如果您想快速进行数值数学运算,则最好选择NumPy for IronPython.
内容总结
以上是互联网集市为您收集整理的.NET数组比IronPython中的列表慢?全部内容,希望文章能够帮你解决.NET数组比IronPython中的列表慢?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。