ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

.NET数组比IronPython中的列表慢?

2019-12-08 10:05:34  阅读:244  来源: 互联网

标签:ironpython python net


我在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.

标签:ironpython,python,net
来源: https://codeday.me/bug/20191208/2090735.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有