异步版本比非异步版本运行慢

rrgirish

我的程序执行以下操作:

  1. 接受.txt文件的文件夹
  2. 对于每个文件:

    2.1。读取文件

    2.2将内容按列表排序,并将列表推送到主列表

我这样做没有任何异步/等待,这是时间统计

real    0m0.036s

user    0m0.018s

sys     0m0.009s

使用下面的异步/等待代码,我得到

real    0m0.144s

user    0m0.116s

sys     0m0.029s

给定用例表明我使用了不正确的aysncio。

有人知道我在做什么错吗?

import asyncio
import aiofiles
import os

directory = "/tmp"
listOfLists = list()

async def sortingFiles(numbersInList):
    numbersInList.sort()

async def awaitProcessFiles(filename,numbersInList):
    await readFromFile(filename,numbersInList)
    await sortingFiles(numbersInList)
    await appendToList(numbersInList)


async def readFromFile(filename,numbersInList):
    async with aiofiles.open(directory+"/"+filename, 'r') as fin:
        async for line in fin:
            return numbersInList.append(int(line.strip("\n"),10))            
    fin.close()    

async def appendToList(numbersInList):
    listOfLists.append(numbersInList)

async def main():
    tasks=[]
    for filename in os.listdir(directory):
        if filename.endswith(".txt"):  
            numbersInList =list()
            task=asyncio.ensure_future(awaitProcessFiles(filename,numbersInList))
            tasks.append(task)
    await asyncio.gather(*tasks)   

if __name__== "__main__":
    asyncio.run(main())

分析信息:

        151822 function calls (151048 primitive calls) in 0.239 seconds

   Ordered by: internal time

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
       11    0.050    0.005    0.050    0.005 {built-in method _imp.create_dynamic}
       57    0.022    0.000    0.022    0.000 {method 'read' of '_io.BufferedReader' objects}
       57    0.018    0.000    0.018    0.000 {built-in method io.open_code}
      267    0.012    0.000    0.012    0.000 {method 'control' of 'select.kqueue' objects}
       57    0.009    0.000    0.009    0.000 {built-in method marshal.loads}
      273    0.009    0.000    0.009    0.000 {method 'recv' of '_socket.socket' objects}
      265    0.005    0.000    0.098    0.000 base_events.py:1780(_run_once)
      313    0.004    0.000    0.004    0.000 {built-in method posix.stat}
      122    0.004    0.000    0.004    0.000 {method 'acquire' of '_thread.lock' objects}
  203/202    0.003    0.000    0.011    0.000 {built-in method builtins.__build_class__}
     1030    0.003    0.000    0.015    0.000 thread.py:158(submit)
     1030    0.003    0.000    0.009    0.000 futures.py:338(_chain_future)
     7473    0.003    0.000    0.003    0.000 {built-in method builtins.hasattr}
     1030    0.002    0.000    0.017    0.000 futures.py:318(_copy_future_state)
       36    0.002    0.000    0.002    0.000 {built-in method posix.getcwd}
     3218    0.002    0.000    0.077    0.000 {method 'run' of 'Context' objects}
     6196    0.002    0.000    0.003    0.000 threading.py:246(__enter__)
     3218    0.002    0.000    0.078    0.000 events.py:79(_run)
     6192    0.002    0.000    0.004    0.000 base_futures.py:13(isfuture)
     1047    0.002    0.000    0.002    0.000 threading.py:222(__init__)

制作一些测试文件...

import random, os
path = <directory name here>
nlines = range(1000)
nfiles = range(1,101)
for n in nfiles:
    fname = f'{n}.txt'
    with open(os.path.join(path,fname),'w') as f:
        for _ in nlines:
            q = f.write(f'{random.randrange(1,10000)}\n')
也许

对于本地文件,asyncio没有什么意义。这就是原因,即使python标准库也没有它们。

async for line in fin:

考虑上一行。事件循环会在每次读取行时暂停该协同例程,并执行其他一些协同例程。这意味着cpu缓存中文件的以下各行仅被丢弃,以为下一个协同程序腾出空间。(尽管它们仍将在RAM中)。

什么时候应该使用aiofile?

考虑到您已经在程序中使用了异步代码,并且有时您必须进行一些文件处理。如果文件处理是在同一事件循环中完成的,则所有其他协同例程将被阻止。在那种情况下,您可以使用aiofile或在其他执行程序中进行处理。

如果程序正在做的只是从文件中读取。顺序执行它们会更快,以便更好地利用缓存。从一个文件跳转到另一个文件就像线程上下文切换,应该使其变慢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Haskell中,异步代码的运行速度比同步版本慢

来自分类Dev

是RelayCommand的异步版本,以便正确运行异步方法

来自分类Dev

为什么此TAP异步/等待代码比TPL版本慢?

来自分类Dev

异步版本的ObjectCache?

来自分类Dev

异步I / O密集型代码的运行速度比非异步慢,为什么?

来自分类Dev

如何从SQLite的异步PCL版本使用SQLiteAsyncConnection?

来自分类Dev

需要帮助以使异步版本的“循环为”

来自分类Dev

异步代码不比同步版本快

来自分类Dev

使用WinForms ProgressBar异步/等待-WinForms版本

来自分类Dev

需要帮助以使异步版本的“循环为”

来自分类Dev

不同DbContext的并行执行比非并行版本慢

来自分类Dev

将asio read_some转换为异步版本

来自分类Dev

使用lambda表达式而不是Write方法的异步版本

来自分类Dev

从同步Task调用方法的异步或同步版本更好吗?

来自分类Dev

在其阻止版本中使用方法的异步实现

来自分类Dev

多个jQuery版本在gmail chrome扩展中异步覆盖

来自分类Dev

通过异步回调函数传递不同版本的变量

来自分类Dev

异步Servlet不异步运行

来自分类Dev

创建异步版本时,是否应该始终包括方法的同步版本?

来自分类Dev

等待非异步方法

来自分类Dev

等待非异步方法

来自分类Dev

在非异步方法中调用异步方法

来自分类常见问题

从非异步代码调用异步方法

来自分类Dev

在非异步方法中使用异步

来自分类Dev

从非异步方法调用异步方法

来自分类Dev

在非异步函数内部调用异步函数

来自分类Dev

非异步循环中的异步方法

来自分类Dev

如何使函数异步运行

来自分类Dev

异步运行存储过程

Related 相关文章

热门标签

归档