CSV 文件处理基准测试:Golang、NestJS、PHP、Python

介绍

高效处理大型 csv 文件是许多应用程序中的常见要求,从数据分析到 etl(提取、转换、加载)过程。在本文中,我想对四种流行编程语言(golang、带有 nestjs 的 nodejs、php 和 python)在 macbook pro m1 上处理大型 csv 文件的性能进行基准测试。我的目标是确定哪种语言可以为该任务提供最佳性能。

测试环境

硬件:macbook pro m1,256gb ssd,8gb ram

软件:

macos 索诺玛 14.5php 8.3.6golang 1.22.4node.js 22.0.0 与 nestjs python 3.12.3

测试数据

我使用了一个名为 sales_data.csv 的合成 csv 文件,其中包含大约 100 万行,每行包含交易详细信息,例如 transaction_id、product_id、数量、价格和时间戳。

任务描述

对于每种语言,脚本执行以下任务:

立即学习“PHP免费学习笔记(深入)”;

读取 csv 文件。计算总销售额。识别销量最高的产品。

执行

以下是每种语言使用的脚本:

go 语言脚本:

销售.go

package mainimport (    "encoding/csv"    "fmt"    "os"    "strconv"    "time")func main() {    start := time.now()    file, err := os.open("../generate-csv/sales_data.csv")    if err != nil {        fmt.println("error:", err)        return    }    defer file.close()    reader := csv.newreader(file)    _, _ = reader.read() // skip header    totalsales := 0.0    productsales := make(map[string]float64)    for {        line, err := reader.read()        if err != nil {            break        }        productid := line[1]        quantity, _ := strconv.atoi(line[2])        price, _ := strconv.parsefloat(line[3], 64)        total := float64(quantity) * price        totalsales += total        productsales[productid] += total    }    var topproduct string    var topsales float64    for product, sales := range productsales {        if sales > topsales {            topproduct = product            topsales = sales        }    }    elapsed := time.since(start)    fmt.printf("golang execution time: %sn", elapsed)    fmt.printf("total sales: $%.2fn", totalsales)    fmt.printf("top product: %s with sales $%.2fn", topproduct, topsales)}

nestjs脚本:

csv.service.ts

import { injectable } from '@nestjs/common';import * as fs from 'fs';import * as fastcsv from 'fast-csv';// path file csvconst global_csv_path = '../generate-csv/sales_data.csv';@injectable()@injectable()export class csvservice {  async parsecsv(): promise {    return new promise((resolve, reject) => {      const starttime = process.hrtime();      let totalsales = 0;      const productsales: { [key: string]: number } = {};      fs.createreadstream(global_csv_path)        .pipe(fastcsv.parse({ headers: true, delimiter: ',' }))        .on('data', (row) => {          const productid = row.product_id;          const quantity = parseint(row.quantity, 10);          const price = parsefloat(row.price);          const total = quantity * price;          totalsales += total;          if (!productsales[productid]) {            productsales[productid] = 0;          }          productsales[productid] += total;        })        .on('end', () => {          const topproduct = object.keys(productsales).reduce((a, b) =>            productsales[a] > productsales[b] ? a : b,          );          const topproductsales = productsales[topproduct] || 0;          const endtime = process.hrtime(starttime);          const nestexecutiontime = endtime[0] + endtime[1] / 1e9;          console.log(`nestjs execution time: ${nestexecutiontime} seconds`);          console.log(`total sales: $${totalsales}`);          console.log(            `top product: ${topproduct} with sales $${topproductsales}`,          );          resolve({            nestexecutiontime,            totalsales,            topproductsales,          });        })        .on('error', (error) => reject(error));    });  }}

csv.controller.ts

import { controller, get } from '@nestjs/common';import { csvservice } from './csv.service';@controller('csv')export class csvcontroller {  constructor(private readonly csvservice: csvservice) {}  @get('parse')  async parsecsv(): promise {    return this.csvservice.parsecsv();  }}

php脚本

销售.php

<?php$start_time = microtime(true);$file = fopen("../generate-csv/sales_data.csv", "r");$total_sales = 0;$product_sales = [];fgetcsv($file); // skip headerwhile (($line = fgetcsv($file)) !== false) {    $product_id = $line[1];    $quantity = (int)$line[2];    $price = (float)$line[3];    $total = $quantity * $price;    $total_sales += $total;    if (!isset($product_sales[$product_id])) {        $product_sales[$product_id] = 0;    }    $product_sales[$product_id] += $total;}fclose($file);arsort($product_sales);$top_product = array_key_first($product_sales);$end_time = microtime(true);$execution_time = ($end_time - $start_time);echo "php execution time: ".$execution_time." secondsn";echo "total sales: $".$total_sales."n";echo "top product: ".$top_product." with sales $".$product_sales[$top_product]."n";

python脚本

import csvimport time# Input file name configinput_file = '../generate-csv/sales_data.csv'def parse_csv(file_path):    start_time = time.time()    total_sales = 0    product_sales = {}    with open(file_path, mode='r') as file:        reader = csv.DictReader(file)        for row in reader:            product_id = row['product_id']            quantity = int(row['quantity'])            price = float(row['price'])            total = quantity * price            total_sales += total            if product_id not in product_sales:                product_sales[product_id] = 0            product_sales[product_id] += total    top_product = max(product_sales, key=product_sales.get)    execution_time = time.time() - start_time    return {        'total_sales': total_sales,        'top_product': top_product,        'top_product_sales': product_sales[top_product],        'execution_time': execution_time,    }if __name__ == "__main__":    result = parse_csv(input_file)    print(f"Python Execution time: {result['execution_time']:.2f} seconds")    print(f"Total Sales: ${result['total_sales']:.2f}")    print(f"Top Product: {result['top_product']} with sales ${          result['top_product_sales']:.2f}")

结果

以下是我们基准测试的结果:

戈兰

执行时间:466.69975ms总销售额:$274654985.36顶级产品:产品 1126,销售额 $305922.81

CSV 文件处理基准测试:Golang、NestJS、PHP、Python

nestjs

执行时间:6.730134208秒总销售额:$274654985.36000216顶级产品:1126,销售额 $305922.8099999997

CSV 文件处理基准测试:Golang、NestJS、PHP、Python

php

执行时间:1.5142710208893秒总销售额:$274654985.36顶级产品:1126 销售额 $305922.81

CSV 文件处理基准测试:Golang、NestJS、PHP、Python

python

执行时间:2.56秒总销售额:$274654985.36顶级产品:1126 销售额 $305922.81

CSV 文件处理基准测试:Golang、NestJS、PHP、Python

分析

我的基准测试揭示了一些有趣的见解:

执行时间:golang 在执行时间方面表现最好,php8 紧随其后,而 nestjs 完成任务的时间最长。
内存使用:build nestjs 表现出高效的内存使用,而 python 表现出更高的内存消耗。
易于实现:golang 提供了最简单的实现,而 nestjs 需要更多的代码行和复杂性。

结论

根据我的发现,golang 提供了最佳的性能速度和内存效率,使其成为处理大型数据集的绝佳选择。

完整代码

您可以在我的 github 存储库上获取完整代码
csv-解析-战斗.

以上就是CSV 文件处理基准测试:Golang、NestJS、PHP、Python的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1244524.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 16:55:44
下一篇 2025年12月9日 16:55:59

相关推荐

  • php漏洞有哪些

    PHP漏洞常见,包括SQL注入、XSS、RCE、文件包含和序列号重用。针对这些漏洞,可采取措施防范,如使用最新PHP版本、安全编码实践、Web应用程序防火墙和定期漏洞扫描。 PHP漏洞概述 PHP是一种广泛应用的服务器端脚本语言,但它也可能存在一些漏洞,给网站和应用程序的安全带来风险。 常见的PHP…

    2025年12月9日
    000
  • 如何更php源码网页地

    要美化 PHP 源码,可以采取以下步骤:使用代码高亮语法;缩进和换行便于阅读;添加注释说明代码逻辑;利用调试工具查找错误;使用版本控制系统管理代码;优化性能减少加载时间;加强安全性防止漏洞;将代码模块化、组织化;编写文档解释代码功能;使用 IDE 并参与代码审查。 如何更php源码网页 1. 使用代…

    2025年12月9日
    000
  • 有哪些php社区

    PHP 社区为开发人员提供支持、资源和连接:官方资源:PHP.net(官方网站)、PHP Foundation(非营利组织)论坛和讨论组:Stack Overflow(问答社区)、PHPBB.com(论坛)、IRC(实时聊天频道)社交媒体:Twitter(话题)、GitHub(项目和讨论)、Link…

    2025年12月9日
    000
  • php需要哪些工具

    PHP 开发所需工具包括:文本编辑器或 IDE(如 Sublime Text、PHPStorm)Web 服务器(如 Apache、Nginx)数据库管理系统(如 MySQL、PostgreSQL)PHP 解释器调试工具(如 XDebug、Var-Dump)版本控制系统(如 Git、Subversio…

    2025年12月9日
    000
  • Symfony Station 公报 — 八月 看看 Symfony、Drupal、PHP、Cyber​​sec 和 Fediverse 新闻!

    此公报最初出现在 symfony station 上。 欢迎来到本周的 Symfony Station 公报。这是您对 Symfony 和 PHP 开发社区中关注保护民主的重要新闻的评论。这就需要一场针对大型科技的固执己见的巴特勒式圣战,并为开源和联邦宇宙传播福音。我们还涵盖网络安全领域。没有安全和…

    2025年12月9日
    000
  • php都有哪些引擎

    PHP引擎是处理和执行PHP脚本的核心组件。最常用的引擎包括:Zend Engine:PHP的默认引擎,因其效率和社区支持而闻名。HHVM:即时编译引擎,以快速执行大型应用程序著称。Phalanger:将PHP编译为MSIL,允许在.NET框架上运行PHP。Quercus:跨平台引擎,因其稳定性和广…

    2025年12月9日
    000
  • php包括哪些课程

    PHP 课程包括:1. 基础概念;2. PHP 语法;3. 数据类型和变量;4. 流程控制语句;5. 函数;6. 数组;7. Web 开发;8. 表单处理;9. 会话管理;10. 数据库连接和查询;11. 面向对象编程;12. 类和对象;13. 继承;14. 多态;15. 高级主题,如错误处理、文件…

    2025年12月9日
    000
  • php网站哪些软件

    PHP 网站必备软件:Web 服务器:Apache、Nginx、IIS数据库管理系统:MySQL、PostgreSQL、MongoDBPHP 框架:Laravel、Symfony、CodeIgniter集成开发环境:PHPStorm、Visual Studio Code、Sublime Text版本…

    2025年12月9日
    000
  • php优化哪些参数

    如何通过优化PHP的php.ini参数来提高性能?内存设置:memory_limit:增加可用内存以防止脚本终止。max_execution_time:限制脚本执行时间以节省资源。优化器设置:opcache.enable:启用OpCache以缓存脚本,提高执行速度。opcache.memory_co…

    2025年12月9日
    000
  • php脚本有哪些

    PHP 脚本主要有以下类型:Web 脚本(如 WordPress)、命令行脚本(如 cron 作业)、桌面应用程序(如 GIMP)、扩展模块(如 cURL)、配置文件(如 php.ini)、单元测试脚本(如 PHPUnit)、代码生成脚本(如 Twig)。这些脚本类型满足各种需求,从动态网页生成到自…

    2025年12月9日
    000
  • php优势有哪些

    PHP 是一种通用脚本语言,特别适合 Web 开发,其优势包括:易于学习、跨平台支持、丰富的模块库、高性能、Web 开发框架的支持、社区支持、面向对象编程和数据库连接。 PHP 的优势 PHP(超文本预处理器)是一种广泛使用的通用脚本语言,尤其适合于 Web 开发。它具有以下优势: 1. 易于学习和…

    2025年12月9日
    000
  • php有哪些好处

    PHP 是广泛使用的 Web 开发语言,提供以下优势:开源和免费使用跨平台兼容庞大且活跃的用户社区丰富的框架和库内置数据库连接功能强大且灵活高性能具备安全功能 PHP 的优势 PHP 是最流行的 Web 开发语言之一,因为它提供了广泛的好处,让开发人员能够高效、快速地构建动态网站和 Web 应用程序…

    2025年12月9日
    000
  • php需要会哪些

    PHP程序员必备技能包括:HTML和CSS:网站结构和视觉呈现基础。PHP语法:基本PHP概念,如变量、函数、条件语句和循环。数据库管理:使用数据库系统存储和管理数据。中间级技能:面向对象编程、框架、版本控制。高级技能:性能优化、安全措施、扩展、RESTful API、DevOps工具。软技能:问题…

    2025年12月9日
    000
  • php技能有哪些

    掌握 PHP 技能可开启 Web 开发机会,包括基础知识(PHP 语法、数据类型、Web 开发基础),高级 PHP(面向对象编程、设计模式、安全最佳实践),框架和 CMS(PHP 框架、内容管理系统),以及其他技能(调试、版本控制、团队协作工具)。这些技能可让您从事 Web 开发人员、后端工程师、全…

    2025年12月9日
    000
  • php后端哪些技能

    掌握以下核心技能是 PHP 后端开发者的必备条件:核心 PHP 知识:变量、数据类型和运算符等条件语句和循环函数和类面向对象编程 (OOP) 原则数据库管理:SQL 和 DBMS数据建模和规范化框架和工具:Laravel、Symfony 等网络安全:验证、CSRF 保护等调试和故障排除性能分析和优化…

    2025年12月9日
    000
  • PHP框架社区的活跃程度对比

    在 php 框架中,社区活跃程度的衡量指标包括贡献者数量、问题的响应时间和支持的文档。laravel 拥有最活跃的社区,其丰富的贡献者、快速的响应时间和全面的文档使其成为初学者和经验丰富的开发人员的理想选择。symfony 提供稳定性,而 codeigniter 以易用的文档吸引初学者。 PHP 框…

    2025年12月9日
    000
  • php要学习哪些

    学习 PHP 所需知识:HTML 和 CSS:创建网页内容和样式PHP 基础:语法、数据类型、运算符等数据库知识:MySQL、SQL网络相关:HTTP 协议、服务器端编程Git 和版本控制:管理代码更改框架和 CMS:Laravel、CodeIgniter、WordPress 学习 PHP 所需知识…

    2025年12月9日
    000
  • SOL币的升级提案是什么?如何跟踪网络改进?

    SOL币的升级提案通过SIPs库公开管理,用户可访问GitHub查看提案详情并跟踪状态;利用Solana Beach等工具监控链上指标如节点版本分布与TPS变化;订阅@solana官方X账号、加入Discord社区及查阅博客获取最新进展。 SOL币的升级提案是推动网络性能与功能迭代的核心机制,用户可…

    2025年12月9日
    000
  • 哪些指标评估SOL币价值?长期持有需注意什么?

    SOL币价值取决于链上活跃度、经济模型、技术稳定性、生态发展与市场情绪。持续增长的DAU、高交易量与稳定币流入反映使用需求;质押率高显示网络安全性强,但需警惕收益率过高带来的中心化风险;历史宕机频发但近期运行稳定,FireDancer升级提升性能;TVL增长与开发者活跃支撑长期生态,NFT市场份额变…

    2025年12月9日
    000
  • 如何评估一个空投项目的预期回报?避免“竹篮打水一场空”

    评估空投项目需综合技术、团队、代币模型与社区活跃度。首先确认项目官网与白皮书披露的技术路线与开发计划是否清晰,核实团队背景及区块链从业经历,并检查GitHub代码更新频率以判断开发进度。其次分析代币经济模型,关注总供应量中空投占比是否过高(警惕超20%),审查解锁机制是否存在短期大量释放风险,并对比…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信