GVKun编程网logo

在Python中,read()或readlines()更快吗?(python read()和readline)

10

最近很多小伙伴都在问在Python中,read和或readlines这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Android中Thread.currentThread()ge

最近很多小伙伴都在问在Python中,read或readlines这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Android中Thread.currentThread()getId()和Process.myTid()之间的区别、Android中Thread.currentThread()。getId()和Process.myTid()之间的区别、File.ReadLines()和File.ReadAllLines()有什么区别?[重复]、Python readlines()用法和有效的阅读实践等相关知识,下面开始了哦!

本文目录一览:

在Python中,read()或readlines()更快吗?(python read()和readline)

在Python中,read()或readlines()更快吗?(python read()和readline)

我想在代码中读取一个大文件。为此,read()或readline()更快。循环如何:

for line in fileHandle

答案1

小编典典

对于文本文件,仅使用循环对其进行遍历for几乎总是可行的方法。没关系,速度是最干净的。

在某些版本的python中,readline()实际上只读取一行,而for循环读取大块并将其分成几行,因此速度可能更快。我认为Python的最新版本也使用缓冲,readline()因此性能差异将很小(for在微观上可能仍然更快,因为它避免了方法调用)。但是,出于性能方面的考虑选择一个可能是过早的优化。

编辑添加:我只是回顾了一些Python发行说明。Python 2.5说:

现在在文件中使用for行混合对文件的迭代并调用文件对象的read()/ readline()/ readlines()方法是非法的。

Python 2.6引入了readline()同时支持迭代和同时支持的TextIOBase 。

Python 2.7固定交织read()readline()

Android中Thread.currentThread()getId()和Process.myTid()之间的区别

Android中Thread.currentThread()getId()和Process.myTid()之间的区别

众所周知

myTid() - 返回调用线程的标识符,该标识符与setThreadPriority(int,int)一起使用。

但是我发现Thread.currentThread().getId()不等于Process.myTid()。因此,我猜前者是JVM版本的线程ID,后者是Linux版本的线程ID。

我对吗?如果是这样,为什么Java会创建自己的线程ID而不使用Linux线程ID?

更新:

经过进一步研究并阅读了android的源代码,我有了新的认识:

Process.myTid()是与平台(OS)相关的操作,Process.setThreadPriority()在android的本机级别源中也是如此,它们都调用系统调用来实现目标。

但是java是一种与平台无关的语言,java并不强制主机os需要“
tid”或getTid()方法,因为另一个os可以通过字符串键(仅作为示例,:)来标识其线程。然后,java用自己的方式标识其线程,在java作用域中分配一个唯一的线程ID,如果Java提供了像这样的静态api
Process.setThreadPriority(),则Java作用域ID肯定是一个参数,但是我们不需要,因为我们可以通过调用来实现线程对象方法setPriority(int priority)

欢迎任何评论。

更新:

答案都是正确的。但是法登的评论使我更加清楚。谢谢你们。

Android中Thread.currentThread()。getId()和Process.myTid()之间的区别

Android中Thread.currentThread()。getId()和Process.myTid()之间的区别

众所周知

myTid() - 返回调用线程的标识符,该标识符与setThreadPriority(int,int)一起使用。

但是我发现Thread.currentThread().getId()不等于Process.myTid()。因此,我猜前者是JVM版本的线程ID,后者是Linux版本的线程ID。

我对吗?如果是这样,为什么Java会创建自己的线程ID而不使用Linux线程ID?

更新:

经过进一步研究并阅读了android的源代码,我有了新的认识:

Process.myTid()是与平台(OS)相关的操作,Process.setThreadPriority()在android的本机级别源中也是如此,它们都调用系统调用来实现目标。

但是java是一种与平台无关的语言,java并不强制主机os需要“
tid”或getTid()方法,因为另一个os可以通过字符串键(仅作为示例,:)来标识其线程。然后,java用自己的方式标识其线程,在java作用域中分配一个唯一的线程ID,如果Java提供了像这样的静态api
Process.setThreadPriority(),则Java作用域ID肯定是一个参数,但是我们不需要,因为我们可以通过调用来实现线程对象方法setPriority(intpriority)

欢迎任何评论。

更新:

答案都是正确的。但是法登的评论使我更加清楚。谢谢你们。

答案1

小编典典

我相信Java环境中有两种类型的线程:

  • 本机线程: 由托管操作系统管理。
  • Java线程: 由JVM管理并与本机线程通信。

File.ReadLines()和File.ReadAllLines()有什么区别?[重复]

File.ReadLines()和File.ReadAllLines()有什么区别?[重复]

这个问题已经在这里有了答案

File.ReadAllLines()和File.ReadAllText()有什么区别? (3个答案)

逐行读取文本文件的最快方法是什么? (8个答案)

6年前关闭。

我有关于File.ReadLines()和File.ReadAllLines()的查询。它们之间有什么区别。我有一个文本文件,其中包含按行排列的数据。File.ReadAllLines()返回数组和使用File.ReadLines().ToArray();也可以得到相同的结果。那么这些方法是否有性能差异?

string[] lines = File.ReadLines("C:\\mytxt.txt").ToArray();

要么

string[] lines = File.ReadAllLines("C:\\mytxt.txt");

Python readlines()用法和有效的阅读实践

Python readlines()用法和有效的阅读实践

我在解析文件夹中的1000个文本文件(每个文件约400KB大小,大约3000行)时遇到问题。我确实使用阅读线阅读它们,

   for filename in os.listdir (input_dir) :       if filename.endswith(".gz"):          f = gzip.open(file, ''rb'')       else:          f = open(file, ''rb'')       file_content = f.readlines()       f.close()   len_file = len(file_content)   while i < len_file:       line = file_content[i].split(delimiter)        ... my logic ...         i += 1

对于来自我的输入的样本(50,100个文件),这完全可以正常工作。当我在整个输入中运行超过5K个文件时,所花费的时间远不及线性增量。我计划进行性能分析并进行Cprofile分析。当输入达到7K文件时,更多文件所花费的时间呈指数增长,并且达到更差的速度。

这是读取行的累计时间,第一行-> 354个文件(来自输入的样本),第二行-> 7473个文件(整个输入)

 ncalls  tottime  percall  cumtime  percall filename:lineno(function) 354    0.192    0.001    **0.192**    0.001 {method ''readlines'' of ''file'' objects} 7473 1329.380    0.178  **1329.380**    0.178 {method ''readlines'' of ''file'' objects}

因此,随着输入的增加,我的代码花费的时间并不是线性缩放的。我读了一些文档说明readlines(),其中有人声称这readlines()会将整个文件内容读入内存,因此与readline()或相比,通常会消耗更多的内存read()

我同意这一点,但是垃圾回收器是否应该在循环结束时自动从内存中清除已加载的内容,因此在任何时候我的内存应该只具有当前正在处理的文件的内容正确吗?但是,这里有一些问题。有人可以对此问题提供一些见解吗?

这是readlines()python垃圾收集器的固有行为还是我的错误解释。很高兴知道。

此外,建议以内存和省时的方式执行此操作的一些替代方法。TIA。

答案1

小编典典

简短的版本是:有效的使用方式readlines()是不使用它。曾经


我在上阅读了一些文档说明readlines(),其中有人声称它readlines()会将整个文件内容读入内存,因此与readline()或read()相比,通常消耗更多的内存。

的文档 明确保证
它将整个文件读入内存,并将其解析为行,并从这些行中构建出完整的信息。readlines()
__list``str

但是文档read()同样保证将整个文件读入内存,并生成一个string,所以这无济于事。


除了使用更多的内存之外,这还意味着您无法完成所有工作,直到完整地阅读了所有内容。如果您以最幼稚的方式交替进行读取和处理,您将至少受益于某些流水线化(这要归功于OS磁盘高速缓存,DMA,CPU管线等),因此您将在下一批处理下一批正在读取。但是,如果您强迫计算机读取整个文件,然后解析整个文件,然后运行代码,则整个文件只会得到一个重叠工作区域,而不是每次读取都产生一个重叠工作区域。


您可以通过三种方式解决此问题:

  1. 周围写一个循环readlines(sizehint)read(size)readline()
  2. 只需将文件用作延迟迭代器即可,而无需调用其中任何一个。
  3. mmap 该文件,它使您无需先读入即可将其视为一个巨大的字符串。

例如,这必须foo一次读取所有内容:

with open(''foo'') as f:    lines = f.readlines()    for line in lines:        pass

但这一次只能读取大约8K:

with open(''foo'') as f:    while True:        lines = f.readlines(8192)        if not lines:            break        for line in lines:            pass

而且这一次只能读取一行-尽管Python被允许(并且将)选择一个不错的缓冲区大小来使事情变得更快。

with open(''foo'') as f:    while True:        line = f.readline()        if not line:            break        pass

这将执行与之前完全相同的操作:

with open(''foo'') as f:    for line in f:        pass

与此同时:

但是垃圾收集器是否应该在循环结束时自动从内存中清除已加载的内容,因此在任何时候我的内存应该只具有当前正在处理的文件的内容正确吗?

Python对垃圾回收没有任何此类保证。

CPython实现恰好对GC使用了refcounting,这意味着在您的代码中,一旦file_content反弹或消失,巨大的字符串列表以及其中的所有字符串将被释放到freelist中,这意味着内存可以再次用于下一遍。

但是,所有这些分配,副本和解除分配都不是免费的-不执行它们比不执行它们要快得多。

最重要的是,让您的字符串分散在一大堆内存中,而不是一遍又一遍地重复使用同一小块内存,这会损害您的缓存行为。

另外,虽然内存使用量可能是恒定的(或者,最大文件的大小是线性的,而不是文件大小的总和),malloc但第一次扩展s的冲动将是最慢的一次您要做的事情(这也会使性能比较变得更加困难)。


综上所述,这就是我编写程序的方式:

for filename in os.listdir(input_dir):    with open(filename, ''rb'') as f:        if filename.endswith(".gz"):            f = gzip.open(fileobj=f)        words = (line.split(delimiter) for line in f)        ... my logic ...

或许:

for filename in os.listdir(input_dir):    if filename.endswith(".gz"):        f = gzip.open(filename, ''rb'')    else:        f = open(filename, ''rb'')    with contextlib.closing(f):        words = (line.split(delimiter) for line in f)        ... my logic ...

今天关于在Python中,read或readlines的介绍到此结束,谢谢您的阅读,有关Android中Thread.currentThread()getId()和Process.myTid()之间的区别、Android中Thread.currentThread()。getId()和Process.myTid()之间的区别、File.ReadLines()和File.ReadAllLines()有什么区别?[重复]、Python readlines()用法和有效的阅读实践等更多相关知识的信息可以在本站进行查询。

本文标签: