百科问答小站 logo
百科问答小站 font logo



pandas为什么读写文件那么快? 第1页

  

user avatar   cao-rong-yu 网友的相关建议: 
      

感谢各位的认可,读源代码的过程很艰难,谢谢大家让我有了继续阅读的动力!


正在看pandas的源代码,相信我的回答能给问主一定的帮助,现在只看了读文件的过程,之后在阅读源码的过程中会不断更新。

首先,看下从pandas.read_csv(filename, kwds)的整个调用过程(这里参数先略去,虽然有些参数很重要),如图所示,用到了1个重要的类,TextReader类,这个类是负责文件读写,核心的加速都在这里,可以看到这个类是用Cython+C写的,然后被编译成parser.pyd文件,用C进行文件读写,因此速度非常快,在读大文件时会比python快很多倍,之后会详细得看这个TextReader类。



对TextReader类进行调用分析(无法调试,只能一行一行看,看起来很艰难),整个调用过程,如图所示,用到了1个类TextReader,这个类负责整个读写过程的调度和获得数据后的处理,用cython编写。还有1个结构体parser_t,这个结构体中存储了文件指针、数据以及对数据分析后的一些变量,在图中已详细介绍这些变量的用途。



整个过程大致是,TextReader创建结构体parser_t的实例parser,用parser打开文件(io.c中),用parser读入数据(io.c中),对数据进行分析并设置单词指针和行指针(tokenize.c),注意,对数据分析的过程是一个有限状态机,之后会详细的看这个过程。


------------------------------------ 2017/05/01更新------------------------------------

源代码中的有限状态机比较复杂,精简后的核心部分如下图。



初始状态为“开始记录”(START_RECORD)。

状态为“开始记录”(START_RECORD),如果读到正常字符,状态变为“开始域”(START_FIELD);如果读到结束符,调用end_line函数,对line_start数组进行更新。

状态为“开始域”(START_FIELD),如果读到正常字符,状态变为“域内”(IN_FIELD),调用push_char函数,对stream数组加1。

状态为“域内”(IN_FIELD),如果读到正常字符,状态变为“域内”(IN_FIELD),调用push_char函数,对stream数组加1;如果读到分隔符(如 ),状态变为“开始域”(START_FIELD),调用end_field函数,更新pword_start和words数组,并且将line_field加1;如果读到结束符(如 ),状态变为“开始记录”(START_RECORD),并调用end_field和end_line函数。

经过上述的有限状态机进行数据处理之后,便能得到stream, words, pword_starts, line_start, line_fields这些重要的数组(上文已经一一介绍)。




  

相关话题

  Python3.10的新特性match关键字为什么不会和当前作用域的变量名称match冲突? 
  R 和 Python (numpy scipy pandas) 用于统计学分析,哪个更好? 
  为什么有些编程语言的数组要从零开始算? 
  同时会C#、Qt还有Python是一种什么体验? 
  如何在业余时学数据分析? 
  为什么现在部分985高校还是给大一上C语言课? 
  你是如何自学 Python 的? 
  按键精灵等以GUI接口为基础的程序在爬虫界的地位是怎样的? 
  Python 有哪些好的学习资料或者博客? 
  为什么看不懂廖雪峰的Python学习教程? 

前一个讨论
2019 年你读了哪些觉得比较好的计算机书籍?
下一个讨论
中科大软件学院这么炸,它的就业到底怎样呢?进大厂拿高薪的机会大吗?





© 2024-06-26 - tinynew.org. All Rights Reserved.
© 2024-06-26 - tinynew.org. 保留所有权利