Python 字典 vs C++ std:unordered_map (cython) vs cythonized python dict

2023-11-21

我试图测量 python 字典、cythonized python 字典和 cythonized cpp std::unordered_map 之间的性能,仅执行 init 过程。如果编译 cythonized cpp 代码,我认为它应该比纯 python 版本更快。我使用 4 种不同的场景/符号选项进行了测试:

  • 使用 std::unordered_map 的 Cython CPP 代码和Cython 书籍符号(定义一对并使用插入方法)
  • 使用 std::unordered_map 和 python 表示法的 Cython CPP 代码(map[key] = value)
  • 使用 python 字典的 Cython 代码(类型化代码)(map[key] = value)
  • 纯Python代码

我期待看到 cython 代码如何优于纯 python 代码,但在这种情况下没有任何改进。可能是什么原因?我正在使用 Cython-0.22、python-3.4 和 g++-4.8。

我使用 timeit 得到了这个执行时间(秒):

  • Cython CPP 书本符号 -> 15.696417249999968
  • Cython CPP python 表示法 -> 16.481350984999835
  • Cython python 表示法 -> 18.585355018999962
  • 纯Python-> 18.162724677999904

代码在这里,您可以使用它:

cython -a map_example.pyx
python3 setup_map.py build_ext --inplace
python3 use_map_example.py

地图示例.pyx

from libcpp.unordered_map cimport unordered_map
from libcpp.pair cimport pair

cpdef int example_cpp_book_notation(int limit):
    cdef unordered_map[int, int] mapa
    cdef pair[int, int] entry

    cdef int i

    for i in range(limit):
        entry.first = i
        entry.second = i
        mapa.insert(entry)
    return 0

cpdef int example_cpp_python_notation(int limit):
    cdef unordered_map[int, int] mapa
    cdef pair[int, int] entry

    cdef int i

    for i in range(limit):
        mapa[i] = i

    return 0


cpdef int example_ctyped_notation(int limit):
    mapa = {}
    cdef int i
    for i in range(limit):
        mapa[i] = i
    return 0

setup_map.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Build import cythonize
from Cython.Distutils import build_ext

import os

os.environ["CC"] = "g++"
os.environ["CXX"] = "g++"


modules = [Extension("map_example",
                 ["map_example.pyx"],
                 language = "c++",
                 extra_compile_args=["-std=c++11"],
                 extra_link_args=["-std=c++11"])]

setup(name="map_example",
     cmdclass={"build_ext": build_ext},
     ext_modules=modules)

use_map_example.py

import map_example

C_MAXV = 100000000
C_NUMBER = 10

def cython_cpp_book_notation():
    x = 1
    while(x<C_MAXV):
        map_example.example_cpp_book_notation(x)
        x *= 10

def cython_cpp_python_notation():
    x = 1
    while(x<C_MAXV):
        map_example.example_cpp_python_notation(x)
        x *= 10

def cython_ctyped_notation():
    x = 1
    while(x<C_MAXV):
        map_example.example_ctyped_notation(x)
        x *= 10


def pure_python():
    x = 1
    while(x<C_MAXV):
        map_a = {}
        for i in range(x):
            map_a[i] = i
        x *= 10
    return 0


if __name__ == '__main__':
    import timeit

    print("Cython CPP book notation")
    print(timeit.timeit("cython_cpp_book_notation()", setup="from __main__ import cython_cpp_book_notation", number=C_NUMBER))


    print("Cython CPP python notation")
    print(timeit.timeit("cython_cpp_python_notation()", setup="from __main__ import cython_cpp_python_notation", number=C_NUMBER))


    print("Cython python notation")
    print(timeit.timeit("cython_ctyped_notation()", setup="from __main__ import cython_ctyped_notation", number=C_NUMBER))

    print("Pure python")
    print(timeit.timeit("pure_python()", setup="from __main__ import pure_python", number=C_NUMBER))

我从你的代码中得到的时间(在更正 python *10 缩进:)之后)是

Cython CPP book notation
21.617647969018435
Cython CPP python notation
21.229907534987433
Cython python notation
24.44413448998239
Pure python
23.609809526009485

基本上每个人都处于同一水平,CPP 版本有一定的优势。

我的机器没什么特别的,通常的 Ubuntu 14.10、0.202 Cython、3.42 Python。

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

Python 字典 vs C++ std:unordered_map (cython) vs cythonized python dict 的相关文章

  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 如何使用 sys.path.append 在 Python 中导入文件?

    我的桌面上有两个目录 DIR1 and DIR2其中包含以下文件 DIR1 file1 py DIR2 file2 py myfile txt 这些文件包含以下内容 file1 py import sys sys path append s
  • 如何使用 Regex.Replace 从字符串中删除数字?

    我需要使用Regex Replace从字符串中删除所有数字和符号 输入示例 123 abcd33输出示例 abcd 请尝试以下操作 var output Regex Replace input d string Empty The d标识符
  • Eigen 和 OpenMP:由于错误共享和线程开销而没有并行化

    系统规格 Intel Xeon E7 v3 处理器 4 插槽 16 核 插槽 2 线程 核心 Eigen 系列和 C 的使用 以下是代码片段的串行实现 Eigen VectorXd get Row const int j const int
  • 什么是空终止字符串?

    它与什么不同标准 字符串 http www cplusplus com reference string string 字符串 实际上只是一个数组chars 空终止字符串是指其中包含空字符的字符串 0 标记字符串的结尾 不一定是数组的结尾
  • Pandas style.bar 颜色基于条件?

    如何渲染其中一列的 Pandas dfstyle bar color属性是根据某些条件计算的 Example df style bar subset before after color ff781c vmin 0 0 vmax 1 0 而
  • 将文本注释到轴并对齐为圆

    我正在尝试在轴上绘制文本并将该文本与圆对齐 更准确地说 有一些具有不同坐标 x y 的点位于该圆内 并使用以下命令创建 ax scatter x y s 100 我想用圆圈连接并标记每个点 Cnameb 文本的坐标由 xp yp 定义 因此
  • 如何将AVFrame转换为glTexImage2D使用的纹理?

    如您所知 AVFrame 有 2 个属性 pFrame gt data pFrame gt linesize 当我从视频 sdcard test mp4 android平台 读取帧后 并将其转换为RGB AVFrame副 img conve
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • 如果输入被重定向则执行操作

    我想知道如果我的输入被重定向 我应该如何在 C 程序中执行操作 例如 假设我有已编译的程序 prog 并且我将输入 input txt 重定向到它 我这样做 prog lt input txt 我如何在代码中检测到这一点 一般来说 您无法判
  • 无法在 python 3.8 上将带有 webapp 的 python 部署到 azure

    我正在尝试使用部署一个测试项目Flask使用以下方法将框架迁移到 Azure 云中Azure CLI https learn microsoft com en us azure app service containers quicksta
  • 如何使用 Keras ImageDataGenerator 预测单个图像?

    我已经训练 CNN 对图像进行 3 类分类 在训练模型时 我使用 keras 的 ImageDataGenerator 类对图像应用预处理功能并重新缩放它 现在我的网络在测试集上训练得非常准确 但我不知道如何在单图像预测上应用预处理功能 如
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 如何使用 matplotlib 为圆柱体的每个单独面添加颜色

    我正在尝试为圆柱体的每个面着色 但是我不确定如何进行 我尝试了以下方法 for i in range 10 col append for i in range 10 for j in range 20 col i append plt cm
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 长/宽数据到宽/长

    我有一个数据框 如下所示 import pandas as pd d decil 1 decil 1 decil 2 decil 2 decil 3 decil 3 decil kommune AA BB AA BB AA BB 2010

随机推荐

  • 基于要在 MSBUILD 中使用的用户定义目录创建 wix 片段文件的最佳方法

    本着 Si 提出这个问题的精神 WiX 技巧和技巧 我正在尝试确定基于目录创建 wix 片段的最佳方法 可以这么说 文件收获 例如 在 bin release 文件夹下 我可以有许多不同的文件夹以及我想在片段中轻松捕获的文件 我一直通过输入
  • Android Systrace 跟踪文件格式

    Android systrace工具 调用atrace通过亚行工具 但是 我不太了解跟踪文件的格式 显然它与linux非常相似ftrace工具有一些差异 主要区别在于它不使用系统映射文件 但它将所有信息包含到跟踪文件中 此外 还有 Andr
  • 从 php 脚本运行 git pull

    我正在尝试完美的工作流程 使用 Git GitHub 和 SSH 除了运行命令之外 我已经设置好了一切git pull来自 PHP 当我跑步时exec git pull i get 无法创建目录 ssh 主机密钥验证失败 fatal 远端意
  • 为什么HashMap的初始容量是16(2的幂)而Hashtable的初始容量是11(素数)?

    如果您知道请描述原因 我用谷歌搜索 但没有找到解释清楚的答案 是为了当你的时候使桶的索引为正吗hashCode是负数吗 For HashMap 存储 Map 条目的数组中的索引是这样计算的 其中h计算自hashCode的密钥 static
  • PyQt 中支持拖放的 QTreeView

    在 PyQt 4 中 我想创建一个 QTreeView 可以通过拖放操作重新组织其结构 我已经为 QTreeView 实现了自己的模型 QAbstractItemModel 因此我的 QTreeView 可以正确显示数据 现在我想添加对树节
  • 查找所选顶点的最小生成树的算法

    人们可以使用 Prim 算法或 Kruskal 算法来查找顶点 节点和边 链接集合的最小生成树 图 不过 我想要的是一种找到该集合的最小生成图的算法 但生成的图需要仅包含任意选择的节点 而不是所有节点 如果结果图包含的节点多于所需的节点也没
  • 如何在 ActiveAdmin 中添加返回应用程序的链接?

    我需要在 ActiveAdmin 页面中添加一些指向应用程序某些页面的链接 我可以使用侧边栏来完成此操作 但我必须为每个资源重复代码 无论如何 是否可以向标题添加自定义链接 或者定义一个针对所有资源显示的侧边栏 我也不想忽略在initial
  • 奇怪的 Maven 内存不足错误

    我目前正在尝试使用 hudson 调用 Maven 来构建我的项目 我不断遇到内存不足错误的问题 我在所有环境变量 hudson 配置和 hudson 项目配置中设置了 xmx 和 xms 我将 xmx 设置为 1500 mb 这应该足够了
  • java中的对象有内存大小限制吗?

    我们可以拥有任意大小的 Java 对象而不用担心异常吗 我将使用一个类的对象 该类包含一个ArrayList数千个其他对象 其中包含几个HashMaps and ArrayLists 和许多其他非原始类型 谢谢 如果你有一个对象 我们称之为
  • 使用 devtools 构建 .md vignette

    我在用着knitr rmarkdown but knitr knitr和我的一样 VignetteEngine 然后我使用构建我的包小插图devtools build vignettes 这可行 但只能在以下位置创建 HTML 和 R 输出
  • IE Date.parse 方法对于带有时间字符串的日期返回 NaN

    我们正在尝试用时间戳字符串解析日期 它在 IE 中崩溃 但在 FireFox 中工作正常 这是代码 警报 新日期 Date parse 2010 01 31T12 00 00 233467 05 00 有什么办法让它在 IE 浏览器中工作吗
  • 使用sbt编译Java注解

    我已经在下面创建了 Java 注释 因为我需要运行时保留 PROJECT src main java我的 scala 代码使用了这些 java 注释 PROJECT src main scala 这样创建的 Java 注释也使用 Java
  • ListView 布局与 RTL 语言(阿拉伯语)渲染不一致

    我有简单的 ListView 和 ArrayAdapter 正在工作正好 问题始于RTL语言 在本例中为阿拉伯语 当你第一次打开它时 一切看起来都很好 但向下滚动并向后滚动后 某些项目似乎渲染不正确 代码很简单 请注意 如果我不重复使用视图
  • 缓存 URL 图像 iphone UITableview

    我正在寻找有关如何将从 url 加载的图像缓存到 uitableview 单元格中的教程 我在这里找到了一个例子 http www ericd net 2009 05 iphone caching images in memory html
  • 如何从 JavaScript 中的 URL 中提取 GET 参数? [复制]

    这个问题在这里已经有答案了 可能的重复 在javascript中使用url的get参数 假设我有这个网址 s http mydomain com q microsoft p next 在这种情况下 如何从字符串中提取 microsoft 我
  • SendGrid 与单个电子邮件的唯一参数

    我尝试为每封电子邮件设置一个唯一参数列表 SMTP api 的官方参考非常简单地描述了此功能 here 我正在使用的 SendGrid PHP 库的 API 文档也没有多大帮助 setUniqueArguments Set a list o
  • 尝试在 pgAdmin4 中备份数据库时出现“[Errno 2] 无此类文件或目录”

    我终于设法在首选项中手动设置 PostgreSQL 二进制路径 为什么用户必须在 pgAdmin3 中不需要时执行此操作 老实说 我不知道第二个路径字段 EDB Advanced Server Binary Path 的含义是什么 但我没有
  • HAProxy - 后端服务器的基本身份验证

    我使用以下配置从本地 127 0 0 1 2000 代理访问互联网 global log 127 0 0 1 local0 log 127 0 0 1 local1 notice log loghost local0 info maxcon
  • 修复重大升级问题

    以下是场景 1 安装 1 0 1 1 然后升级到 1 0 2 2 gt 这很好用 如预期 2 安装 1 0 2 2 然后降级到 1 0 1 1 gt 这不起作用 如预期 3 安装 1 0 1 1 然后安装 1 0 1 1 gt 这将进入修复
  • Python 字典 vs C++ std:unordered_map (cython) vs cythonized python dict

    我试图测量 python 字典 cythonized python 字典和 cythonized cpp std unordered map 之间的性能 仅执行 init 过程 如果编译 cythonized cpp 代码 我认为它应该比纯