使用python读取大型文本文件要比使用Matlab读取相同文本的相同代码慢得多,知道为什么吗?

使用python读取大型文本文件要比使用Matlab读取相同文本的相同代码慢得多,知道为什么吗?,python,xml,matlab,text,Python,Xml,Matlab,Text,我在Matlab中有以下用于读取文本文件的代码文本文件具有XML格式,但我将其作为文本文件读取: function [jointAngleData,PositionData, AccelerationData,OrientationData, AngularVelocityData,AngularAccelerationData,TimeStamps] = getDatafromMVNX (file,eliminate_samples) fid=fopen (

我在Matlab中有以下用于读取文本文件的代码文本文件具有XML格式,但我将其作为文本文件读取:

    function [jointAngleData,PositionData, AccelerationData,OrientationData, 
    AngularVelocityData,AngularAccelerationData,TimeStamps] = getDatafromMVNX 
    (file,eliminate_samples)
    fid=fopen (file);
    currentline=fgetl(fid);
    jointAngleData =[];
    PositionData = [];
    AccelerationData = [];
    OrientationData = [];
    AngularVelocityData = [];
    AngularAccelerationData = [];
    while ischar(currentline)

if (contains(currentline,'<jointAngle>'))  
     [data,~]=strsplit(currentline,'<\D*>','DelimiterType', 'RegularExpression');
     currentlinedata = str2num(data{2}); %#ok<*ST2NM>
     jointAngleData = [jointAngleData ; currentlinedata];  %#ok<*AGROW>
 end
 if (contains(currentline,'<position>'))
     [data,~]=strsplit(currentline,'<\D*>','DelimiterType', 'RegularExpression');
     currentlinedata = str2num(data{2});
     PositionData = [PositionData ; currentlinedata]; 
 end

 if (contains(currentline,'<acceleration>'))
     [data,~]=strsplit(currentline,'<\D*>','DelimiterType', 'RegularExpression');
     currentlinedata = str2num(data{2});
     AccelerationData = [AccelerationData ; currentlinedata]; 
 end

 if (contains(currentline,'<orientation>'))
     [data,~]=strsplit(currentline,'<\D*>','DelimiterType', 'RegularExpression');
     currentlinedata = str2num(data{2});
     OrientationData = [OrientationData ; currentlinedata]; 
 end
 if (contains(currentline,'<angularVelocity>'))
     [data,~]=strsplit(currentline,'<\D*>','DelimiterType', 'RegularExpression');
     currentlinedata = str2num(data{2});
     AngularVelocityData = [AngularVelocityData ; currentlinedata]; 
 end

 if (contains(currentline,'<angularAcceleration>'))
     [data,~]=strsplit(currentline,'<\D*>','DelimiterType', 'RegularExpression');
     currentlinedata = str2num(data{2});
     AngularAccelerationData = [AngularAccelerationData ; currentlinedata]; 
 end
 currentline=fgetl(fid);

 end
Data_ends = size(jointAngleData,1)-eliminate_samples;
jointAngleData = jointAngleData(1:Data_ends,:);
AccelerationData = AccelerationData(1:Data_ends,:);
OrientationData = OrientationData(4:Data_ends+3,:);
PositionData = PositionData(4:Data_ends+3,:);
AngularVelocityData = AngularVelocityData(1:Data_ends,:);
AngularAccelerationData = AngularAccelerationData(1:Data_ends,:);
TimeStamps = size(OrientationData,1);
end
函数[jointangeldata,PositionData,AccelerationData,OrientationData,
AngularVelocityData,AngularAccelerationData,时间戳]=getDatafromMVNX
(归档,消除样本)
fid=fopen(文件);
currentline=fgetl(fid);
jointangeldata=[];
位置数据=[];
AccelerationData=[];
方向数据=[];
AngularVelocityData=[];
角度加速度数据=[];
而ischar(currentline)
如果(包含(当前行“”)
[data,~]=strsplit(currentline,,'DelimiterType,,'RegularExpression');
currentlinedata=str2num(数据{2});%#好啊
JointangelData=[JointangelData;currentlinedata];%#好啊
结束
如果(包含(当前行“”)
[data,~]=strsplit(currentline,,'DelimiterType,,'RegularExpression');
currentlinedata=str2num(数据{2});
位置数据=[PositionData;currentlinedata];
结束
如果(包含(当前行“”)
[data,~]=strsplit(currentline,,'DelimiterType,,'RegularExpression');
currentlinedata=str2num(数据{2});
AccelerationData=[AccelerationData;currentlinedata];
结束
如果(包含(当前行“”)
[data,~]=strsplit(currentline,,'DelimiterType,,'RegularExpression');
currentlinedata=str2num(数据{2});
OrientationData=[OrientationData;currentlinedata];
结束
如果(包含(当前行“”)
[data,~]=strsplit(currentline,,'DelimiterType,,'RegularExpression');
currentlinedata=str2num(数据{2});
AngularVelocityData=[AngularVelocityData;currentlinedata];
结束
如果(包含(当前行“”)
[data,~]=strsplit(currentline,,'DelimiterType,,'RegularExpression');
currentlinedata=str2num(数据{2});
AngularAccelerationData=[AngularAccelerationData;currentlinedata];
结束
currentline=fgetl(fid);
结束
数据结束=大小(数据,1)-消除样本;
JointangelData=JointangelData(1:数据_结束,:);
AccelerationData=AccelerationData(1:数据结束,:);
方向数据=方向数据(4:数据+3,:);
位置数据=位置数据(4:数据+3,:);
AngularVelocityData=AngularVelocityData(1:数据结束,:);
AngularAccelerationData=AngularAccelerationData(1:数据结束,:);
时间戳=大小(方向数据,1);
结束
对于相同的任务,我用python编写了一段代码:

def _read_feature_text(line):


   start = line.find('>')+1
   lend = line.find('</') 
   workingportion = line[start:lend]
   return pd.DataFrame([np.fromstring(workingportion,sep= ' ')])


def read_mvnx(mvnxfile):

 from bs4 import BeautifulSoup
 myfile  = open (mvnxfile,"r")
 contents = myfile.read()
 orientation = pd.DataFrame()
 positions = pd.DataFrame()
 velocities = pd.DataFrame()
 accelerations = pd.DataFrame()
 angularVelocities = pd.DataFrame()
 angularAccelerations = pd.DataFrame()
 jointAngles = pd.DataFrame()
 with myfile:

    wholefilecontent = myfile.readlines()
    #line = myfile.readline()
    start_time = timeit.default_timer()

    for line in wholefilecontent:

        if ('orientation' in line):
            orientation = orientation.append(_read_feature_text(line),ignore_index = True)
        elif ('position' in line):
            positions = positions.append(_read_feature_text(line),ignore_index = True)
        elif ('velocity' in line):
            velocities = velocities.append(_read_feature_text(line),ignore_index = True)
        elif ('acceleration' in line):
            accelerations = accelerations.append(_read_feature_text(line),ignore_index = True)
        elif ('angularVelocity' in line):
            angularVelocities = angularVelocities.append(_read_feature_text(line),ignore_index = True)
        elif ('angularAcceleration' in line):
            angularAccelerations = angularAccelerations.append(_read_feature_text(line),ignore_index = True)
        elif ('joinAngle' in line):
            jointAngles = jointAngles.append(_read_feature_text(line),ignore_index = True)

    elapsed = timeit.default_timer() -start_time
    print(elapsed)
def\u读取功能\u文本(行):
开始=行。查找('>')+1

lend=line.find(“对于我的代码,我发现它太慢是因为在每行中找到数据后,我将其转换为一个数据帧,并将其附加到全局数据帧的末尾。这种转换使它非常慢。我通过将数据放在一个numpy数组中,然后将整个numpy数组转换为一个数据帧来修复它最后


我还使用xmltodic包来解析整个文件,而不是逐行解析。

对于我的代码,我发现它太慢的原因是,在找到每行中的数据后,我将其转换为一个数据帧,并将其附加到全局数据帧的末尾。这种转换使它非常慢。我通过将数据放在一个numpy数组中,然后在最后将整个numpy数组转换为一个数据帧


我还使用xmltodic包来解析文件,而不是逐行解析。

是的,MATLAB比Python快。这里有很多问题都在问同样的问题。Python不是为速度而生的。Python速度较慢,因为它的开发人员不像MATLAB的开发人员那样关心速度。感谢Cris Luengo,感谢cOMENT。我还没有发现任何有用的东西来解释为什么它会慢得多,或者为什么它会慢得多。但参考我的代码,我发现它太慢的原因是,在找到每行中的数据后,我将其转换为一个数据帧,并将其附加到全局数据帧的末尾。这种转换它是非常慢的。我把它固定在一个麻木数组中,然后把整个NUMPY数组转换成一个数据框。考虑把你的解决方案作为下面的答案。是的,Matlab比Python快。这里有很多问题要求相同。Python不是为了速度。Python更慢,因为它是开发者。不要像MATLAB的开发人员那样关心速度。感谢Cris Luengo的评论。我没有发现任何有用的东西来解释为什么速度会这么慢,或者为什么速度会这么慢。但是参考我的代码,我发现速度太慢的原因是,在找到我转换的每一行中的数据之后它是一个数据文件,并把它附加到全局数据文件的末尾。这个转换使它变得非常慢。我把它固定在一个麻木数组中,然后把整个NUMPY数组转换成一个数据文件。