搜索 csv 文件最快的方法是什么?

2023-11-22

任务:检查文件中序列号和护照号码的可用性。

我的决定如下:

def check_passport(filename, series: str, number: str) -> dict:
    """
    Find passport number and series
    :param filename:csv filename path
    :param series: passport series
    :param number: passport number
    :return:
    """
    print(f'series={series}, number={number}')
    find = False
    start = datetime.datetime.now()
    with open(filename, 'r', encoding='utf_8_sig') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        try:
            for row in reader:
                if row[0] == series and row[1] == num:
                    print(row[0])
                    print(row[1])
                    find = True
                    break
        except Exception as e:
            print(e)
    print(datetime.datetime.now() - start)
    if find:
        return {'result': False, 'message': f'Passport found'}
    else:
        return {'result': False, 'message': f'Passport not found in Database'}

这是 csv 文件的一部分

PASSP_SERIES,PASSP_NUMBER
3604,015558 
6003,711925 
6004,461914 
6001,789369

如果您的档案中没有护照,则时间会更糟,因为您需要检查所有行。我的最好成绩是53秒。


检查了三种解决方案

  1. 原帖的CSV逐行方法
  2. 使用原始文本而不是使用 CSV 阅读器进行分区 CSV 字段
  3. 使用 Pandas 读取和处理块中的数据

Results Test performed using 10 million to 30 million rows. enter image description here

Summary使用 Pandas 是最慢的方法。当观察到这一点时,这并不奇怪本文被考虑(即 Pandas 由于其开销而成为读取 CSV 文件的较慢方法之一)。 最快的方法是将文件作为原始文本文件处理并查找原始文本中的数字(比最初发布的使用 CSV 阅读器的方法快约 2 倍)。 Pandas 比原始方法慢约 30%。

测试代码

import timeit
import time
import random
import numpy as np
import pandas as pd
import csv
import matplotlib.pyplot as plt
import math
import itertools

def wrapper(func, *args, **kwargs):
    " Use to produced 0 argument function for call it"
    # Reference https://www.pythoncentral.io/time-a-python-function/
    def wrapped():
        return func(*args, **kwargs)
    return wrapped

def method_line_by_line(filename, series: str, number: str) -> dict:
    """
    Find passport number and series
    :param filename:csv filename path
    :param series: passport series
    :param number: passport number
    :return:
    """
    find = False
    with open(filename, 'r', encoding='utf_8_sig') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        try:
            for row in reader:
                if row[0] == series and row[1] == num:
                    find = True
                    break
        except Exception as e:
            pass

    if find:
        return {'result': True, 'message': 'Passport found'}
    else:
        return {'result': False, 'message': 'Passport not found in Database'}

def method_raw_text(filename, series: str, number: str) -> dict:
    """
    Find passport number and series by interating through text records
    :param filename:csv filename path
    :param series: passport series
    :param number: passport number
    :return:
    """
    pattern = series + "," + number
    with open(filename, 'r', encoding='utf_8_sig') as csvfile:
        if any(map(lambda x: pattern == x.rstrip(), csvfile)): # iterates through text looking for match
            return {'result': True, 'message': 'Passport found'}
        else:
            return {'result': False, 'message': 'Passport not found in Database'}

def method_pandas_chunks(filename, series: str, number: str) -> dict:
    """
    Find passport number and series using Pandas in chunks
    :param filename:csv filename path
    :param series: passport series
    :param number: passport number
    :return:
    """
    chunksize = 10 ** 5
    for df in pd.read_csv(filename, chunksize=chunksize, dtype={'PASSP_SERIES': str,'PASSP_NUMBER':str}):

      df_search = df[(df['PASSP_SERIES'] == series) & (df['PASSP_NUMBER'] == number)]

      if not df_search.empty:
        break

    if not df_search.empty:
        return {'result': True, 'message': 'Passport found'}
    else:
        return {'result': False, 'message': 'Passport not found in Database'}

def generate_data(filename, number_records):
    " Generates random data for tests"
    df = pd.DataFrame(np.random.randint(0, 1e6,size=(number_records, 2)), columns=['PASSP_SERIES', 'PASSP_NUMBER'])
    df.to_csv(filename, index = None, header=True)
    return df

def profile():
    Nls = [x for x in range(10000000, 30000001, 5000000)] # range of number of test rows
    number_iterations = 3 # repeats per test
    methods = [method_line_by_line, method_raw_text, method_pandas_chunks]
    time_methods = [[] for _ in range(len(methods))]

    for N in Nls:
        # Generate CSV File with N rows
        generate_data('test.csv', N)

        for i, func in enumerate(methods):
            wrapped = wrapper(func, 'test.csv', 'x', 'y') # Use x & y to ensure we process entire
                                                          # file without finding a match
            time_methods[i].append(math.log(timeit.timeit(wrapped, number=number_iterations)))

    markers = itertools.cycle(('o', '+', '.'))
    colors = itertools.cycle(('r', 'b', 'g'))
    labels = itertools.cycle(('line-by-line', 'raw-text', 'pandas'))
    print(time_methods)
    for i in range(len(time_methods)):
        plt.plot(Nls,time_methods[i],marker = next(markers),color=next(colors),linestyle='-',label=next(labels))

    plt.xlabel('list size', fontsize=18)
    plt.ylabel('log(time)', fontsize=18)
    plt.legend(loc = 'upper left')
    plt.show()

# Run Test
profile()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

搜索 csv 文件最快的方法是什么? 的相关文章

  • openpyxl 2.4.2:保存后公式生成的单元格值为空

    我使用 openpyxl 打开文件 编辑一些单元格并保存更改 这是一个例子 import openpyxl book openpyxl load workbook sheet path sheet book active for row i
  • 将 pandas 数据框中的列减去其第一个值

    我需要将 pandas 数据帧的一列中的所有元素减去其第一个值 在这段代码中 pandas 抱怨 self inferred type 我猜这是循环引用 df Time df Time df Time 0 在这段代码中 pandas 抱怨为
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • python ttk treeview:如何选择并设置焦点在一行上?

    我有一个 ttk Treeview 小部件 其中包含一些数据行 如何设置焦点并选择 突出显示 指定项目 tree focus set 什么也没做 tree selection set 0 抱怨 尽管小部件明显填充了超过零个项目 但未找到项目
  • 行为:如何从另一个文件导入步骤?

    我刚刚开始使用behave http pythonhosted org behave 一个Pythonic BDD框架 使用小黄瓜语法 http docs behat org guides 1 gherkin html 行为需要一个特征 例
  • 使用Python将图像转换为十六进制格式

    我的下面有一个jpg文件tmp folder upload path tmp resized test jpg 我一直在使用下面的代码 Method 1 with open upload path rb as image file enco
  • 使用循环将对象添加到列表(python)

    我正在尝试使用 while 循环将对象添加到列表中 基本上这就是我想做的 class x pass choice raw input pick what you want to do while choice 0 if choice 1 E
  • 在 Windows 上使用 IPython 笔记本时出现 500 服务器错误

    我刚刚在 Windows 7 Professional 64 位上全新安装了 IPython 笔记本 我采取的步骤是 从以下位置安装 Python 3 4 1http python org http python org gt pip in
  • FastText - 由于 C++ 扩展未能分配内存,无法加载 model.bin

    我正在尝试使用 FastText Python APIhttps pypi python org pypi fasttext https pypi python org pypi fasttext虽然 据我所知 此 API 无法加载较新的
  • ValueError:无法插入 ID,已存在

    我有这个数据 ID TIME 1 2 1 4 1 2 2 3 我想按以下方式对数据进行分组ID并计算每组的平均时间和规模 ID MEAN TIME COUNT 1 2 67 3 2 3 00 1 如果我运行此代码 则会收到错误 ValueE
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • Plotly:如何避免巨大的 html 文件大小

    我有一个 3D 装箱模型 它使用绘图来绘制输出图 我注意到 绘制了 600 个项目 生成 html 文件需要很长时间 文件大小为 89M 这太疯狂了 我怀疑可能存在一些巨大的重复 或者是由单个项目的 add trace 方法引起的 阴谋 为
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • Google App Engine 中的自定义身份验证

    有谁知道或知道我可以在哪里学习如何使用 Python 和 Google App Engine 创建自定义身份验证流程 我不想使用 Google 帐户进行身份验证 并且希望能够创建自己的用户 如果不是专门针对 Google App Engin
  • 如何对字符串列表进行排序?

    在 Python 中创建按字母顺序排序的列表的最佳方法是什么 基本回答 mylist b C A mylist sort 这会修改您的原始列表 即就地排序 要获取列表的排序副本而不更改原始列表 请使用sorted http docs pyt
  • 使用 Keras 和 fit_generator 绘制 TensorBoard 分布和直方图

    我正在使用 Keras 使用 fit generator 函数训练 CNN 这似乎是一个已知问题 https github com fchollet keras issues 3358TensorBoard 在此设置中不显示直方图和分布 有
  • 从时间序列生成日期特征

    我有一个数据框 其中包含如下列 Date temp data holiday day 01 01 2000 10000 0 1 02 01 2000 0 1 2 03 01 2000 2000 0 3 30 01 2000 200 0 30
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is

随机推荐

  • 序列化异步有很多关系

    我对 EmberJS 相当陌生 我整个晚上都在摆弄 试图在我正在开发的新应用程序中保留一些 hasMany 和多对多关系 我正在使用 Ember DataActiveModelAdapter将其连接到我正在使用的 Rails 后端Activ
  • Angular JS,“nomod”,模块“{0}”不可用!你要么拼写错误

    这是我的index html中的代码
  • 出生日期验证不断显示

    我正在输入一个DOB 22 12 1986进入我的文本框 验证不断触发 它说 The field DOB must be a date My MODEL System ComponentModel DisplayName DOB Displ
  • 如何加密 cookie 值?

    如何在 PHP 中加密并随后解密 cookie 值 加密的安全性如何 有多种不同的方法可以对 cookie 和其他地方的信息进行加密 加密强度将根据您选择进行实际加密的方法而有所不同 mycrypt是一个很好的起点 看这个答案有关使用 mc
  • 在 gRPC 客户端服务器通信中使用 SSL

    我对 SSL TLS 一无所知 并且正在尝试按照网上找到的说明在 gRPC 中使用 SSL TLS 通道 这是服务器代码 std string server address 0 0 0 0 50051 GreeterServiceImpl
  • jpa hibernate @OneToOne @JoinColumn referencedColumnName 被忽略

    我在对与另一个具有一对一关系的实体执行 jpql 查询时遇到意外行为 关键点在于 关系是从根实体的主键到目标实体的字段 不是 ID 这是示例 root entity Entity Table name PERSON public class
  • 将 Picasso 与 Image Getter 结合使用

    我正在构建一个聊天应用程序 并尝试将图像附加到 EditText 通过使用 Picasso 从 URL 获取图像 并使用附加和 ImageGetter 将图像附加到 EditText 但是 我在下面实现的内容不起作用 因为使用应用程序时附加
  • 在 2 行 Gridview 之间添加视图

    我有一个 GridView 每行有 3 个元素 当我单击一个项目时 该行下方会出现一个新视图 它有点像 iOS 上的文件夹应用程序 我在 SO 或 Google 上没有找到任何答案 也许你可以给我一些提示 您可以轻松地做到这一点GridLa
  • Android AsyncTask - 执行顺序

    我面临有关 AsyncTasks 执行顺序的问题 我的问题是 假设我有 AsyncTask 的 2 个实现 我的异步任务1 and 我的异步任务2 按以下方式调用 new MyAsyncTask1 execute new MyAsyncTa
  • 按钮边框颜色问题

    我使用以下 HTML 和 CSS 代码创建了一个按钮 btnstyle2 height 28px text align center background color F8F8F8 border radius 3px border colo
  • Spark List 中的 itemChangeEffect 等效项是什么?

    在 Flex 3 中 使用 List 组件 您可以向 itemChangeEffect 属性添加效果 从而允许您以动画方式添加 删除列表控件中的项目 Spark 列表中的等效项似乎是 rendererAdd 和 Removed 事件 但这不
  • 16:9 宽高比,固定宽度

    例如 如果我要嵌入 YouTube 视频 使用 jQuery 我会设置纵横比为 16 9 的高度 因此如果宽度为 560 则高度应为 315px 我有这个 jquery 来设置高度 但我不知道如何应用 16 9 比例 player pare
  • Python - 从可执行文件运行时,Multiprocessing.processes 成为主进程的副本[重复]

    这个问题在这里已经有答案了 我刚刚在我的程序中发现了一个与 Python 多处理模块的使用相关的奇怪错误 当我在我的机器上从源代码运行程序时 一切正常 但我一直使用 pyinstaller 将其构建为可执行文件 并且由于某种原因 当我运行从
  • JAXB:所有元素都需要命名空间前缀

    我正在使用 Spring WebServiceTemplate 进行 Web 服务调用 该调用使用 JAXB 生成请求 XML 我的要求需要 SOAP 请求中的所有元素 包括根 都具有名称空间前缀 只有一个名称空间 Ex
  • 以编程方式从 Google Play 商店下载 APK

    我正在创建一个 Android 应用程序 它依赖于其他一些 Android 应用程序 因此 如果这些依赖的应用程序尚未存在于用户的移动设备上 我想以编程方式从游戏商店下载它们 但在此过程中 我不希望控件转到 Play 商店应用程序 即不应显
  • iOS 8:UIAlertView / UIAlertController 不显示文本或按钮

    我有一个 UIAlertView 它在 iOS 7 中完美显示 但在 iOS 8 中 它不显示任何按钮或标签 警报仍然可见 但只是一个小白框 确定 和 取消 按钮也会接收其事件 但看不到任何文本 我已使用此警报在单击按钮时显示 IBActi
  • 重用 WCF 代理当前程序集中的类型

    VS WCF 集成有一个很好的选项 在引用的程序集中重用类型 问题是我需要相同的东西 但对于当前的程序集 有些类型已在我的程序集中定义 我需要重用它们 使用场景 我有组装 这里有 TypeA 我向其中添加了服务引用 其中一种方法返回与 Ty
  • display.getRealMetrics() 已弃用

    我正在使用 getRealMetrics 方法并发现它已被弃用 val display this display display getRealMetrics outMetrics 任何人都知道替代方案是什么 据官方称docs推荐的方法是使
  • 在 sphinx4 5prealpha 中运行对话框演示时无法访问麦克风

    我正在尝试运行 sphinx 4 pre alpha 的对话框演示 但它给出了错误 我正在创建一个实时语音应用程序 我使用 Maven 导入了项目 并遵循了有关堆栈溢出的指南 https stackoverflow com a 259630
  • 搜索 csv 文件最快的方法是什么?

    任务 检查文件中序列号和护照号码的可用性 我的决定如下 def check passport filename series str number str gt dict Find passport number and series pa