Python timeit 的令人惊讶的结果:Counter() vs defaultdict() vs dict()

2023-12-02

我使用 timeit 获得了非常令人惊讶的结果,有人可以告诉我我是否做错了什么?我正在使用Python 2.7。

这是文件 speedtest_init.py 的内容:

import random

to_count = [random.randint(0, 100) for r in range(60)]

这些是 speedtest.py 的内容:

__author__ = 'BlueTrin'

import timeit

def test_init1():
    print(timeit.timeit('import speedtest_init'))

def test_counter1():
    s = """\
    d = defaultdict(int);
    for i in speedtest_init.to_count:
        d[i] += 1
    """
    print(timeit.timeit(s, 'from collections import defaultdict; import speedtest_init;'))

def test_counter2():
    print(timeit.timeit('d = Counter(speedtest_init.to_count);', 'from collections import Counter; import speedtest_init;'))


if __name__ == "__main__":
    test_init1()
    test_counter1()
    test_counter2()

控制台输出为:

C:\Python27\python.exe C:/Dev/codility/chlorum2014/speedtest.py
2.71501962931
65.7090444503
91.2953839048

Process finished with exit code 0

我认为默认情况下 timeit() 运行代码的 1000000 次,因此我需要将时间除以 1000000,但令人惊讶的是 Counter 比 defaultdict() 慢。

这是预期的吗?

EDIT:

使用 dict 也比 defaultdict(int) 更快:

def test_counter3():
    s = """\
    d = {};
    for i in speedtest_init.to_count:
        if i not in d:
            d[i] = 1
        else:
            d[i] += 1
    """
    print(timeit.timeit(stmt=s, setup='from collections import defaultdict; import speedtest_init;')

最后一个版本比 defaultdict(int) 更快,这意味着除非您更关心可读性,否则应该使用 dict() 而不是 defaultdict()。


是的,这是预期的;这Counter() 构造函数 uses Counter.update()它使用self.get()加载初始值而不是依赖__missing__.

此外,defaultdict __missing__工厂完全用 C 代码处理,特别是在使用另一种类型时,例如int()它本身是用 C 实现的。Counter源是纯Python,因此Counter.__missing__方法需要Python框架才能执行。

Because dict.get()仍然用 C 处理,构造函数方法是更快的方法Counter(),只要你使用同样的技巧Counter.update()使用和别名self.get首先作为本地查找:

>>> import timeit
>>> import random
>>> import sys
>>> sys.version_info
sys.version_info(major=2, minor=7, micro=9, releaselevel='final', serial=0)
>>> to_count = [random.randint(0, 100) for r in range(60)]
>>> timeit.timeit('for i in to_count: c[i] += 1',
...               'from collections import Counter; from __main__ import to_count; c = Counter()',
...               number=10000)
0.2510359287261963
>>> timeit.timeit('for i in to_count: c[i] = c_get(i, 0) + 1',
...               'from collections import Counter; from __main__ import to_count; c = Counter(); c_get = c.get',
...               number=10000)
0.20978617668151855

Both defaultdict and Counter是为功能而非性能而构建的有用类;不依赖于__missing__hook 还可以更快:

>>> timeit.timeit('for i in to_count: d[i] = d_get(i, 0) + 1',
...               'from __main__ import to_count; d = {}; d_get = d.get',
...               number=10000)
0.11437392234802246

这是一个使用别名的常规字典dict.get()最大速度的方法。但随后你还必须重新实现 bag 行为Counter, 或者Counter.most_common()方法。这defaultdict用例远远超出了计算的范围。

在 Python 3.2 中,更新了Counter()通过添加处理这种情况的 C 库,速度得到了提升;看问题 10667。在 Python 3.4 上进行测试Counter()构造函数现在击败了别名dict.get case:

>>> timeit.timeit('Counter(to_count)',
...               'from collections import Counter; from __main__ import to_count',
...               number=100000)
0.8332311600097455
>>> timeit.timeit('for i in to_count: d[i] = d_get(i, 0) + 1',
...               'from __main__ import to_count; d = {}; d_get = d.get',
...               number=100000)
0.961191965994658
>>> import sys
>>> sys.version_info
sys.version_info(major=3, minor=4, micro=2, releaselevel='final', serial=0)

(注意:为了获得有意义的计时结果,迭代次数从 10k 增加到 100k;因此,如果将这些与dict.get()在上面的情况下,您需要将计时时间乘以 10,即 1.144 秒)。

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

Python timeit 的令人惊讶的结果:Counter() vs defaultdict() vs dict() 的相关文章

  • 如何在多进程系统中实现锁定?

    我们正在并行运行许多詹金斯项目 我们使用 python 并且选择使用 pyenv 管理虚拟环境 不幸的是 pyenv 有一个众所周知的竞争条件 https github com yyuu pyenv issues 174 为了解决这个问题
  • 获取 .wav 文件长度或持续时间

    我正在寻找一种方法来找出 python 中音频文件 wav 的持续时间 到目前为止我已经了解了 pythonwave图书馆 mutagen pymedia pymad我无法获取 wav 文件的持续时间 Pymad给了我持续时间 但它不一致
  • Mypy 无法从文字列表推断项目的类型

    我有一个变量x和一个文字列表 例如 0 1 2 我想转换x这些文字之一 如果x在列表中 我将其退回 否则我返回一个后备值 from typing import Literal Set Foo Literal 0 1 2 foos Set F
  • 使用 Django 将文件异步上传到 Amazon S3

    我使用此文件存储引擎在上传文件时将文件存储到 Amazon S3 http code welldev org django storages wiki Home http code welldev org django storages w
  • 使用 Boto3 以字符串形式打开 S3 对象

    我知道使用 Boto 2 可以使用以下命令将 S3 对象作为字符串打开 get contents as string http boto readthedocs org en latest ref file html highlight c
  • 无法在 selenium 和 requests 之间传递 cookie,以便使用后者进行抓取

    我用 python 结合 selenium 编写了一个脚本来登录网站 然后从driver to requests这样我就可以继续使用requests进行进一步的活动 I used item soup select one div class
  • 创建上下文后将 jar 文件添加到 pyspark

    我正在笔记本上使用 pyspark 并且不处理 SparkSession 的创建 我需要加载一个包含一些我想在处理 rdd 时使用的函数的 jar 您可以使用 jars 轻松完成此操作 但在我的特定情况下我无法做到这一点 有没有办法访问sp
  • 运行 Python 单元测试,以便成功时不打印任何内容,失败时仅打印 AssertionError()

    我有一个标准单元测试格式的测试模块 class my test unittest TestCase def test 1 self tests def test 2 self tests etc 我的公司有一个专有的测试工具 它将作为命令行
  • 根据其他单元格值更改多个单元格值

    我想更改包含的单元格moving to movingToOpenor movingToClose基于下一个单元格中给出的状态 有时循环会被中断并且不会从open to close or close to open 这是我当前的数据框 Dat
  • Paste.httpserver 并通过 HTTP/1.1 Keep-alive 减慢速度;使用 httperf 和 ab 进行测试

    我有一个基于paste httpserver 的Web 服务器作为HTTP 和WSGI 之间的适配器 当我使用 httperf 进行性能测量时 如果每次使用 num conn 启动一个新请求 我每秒可以执行超过 1 000 个请求 如果我使
  • 两个不同长度的数据帧的列之间的余弦相似度?

    我在 df1 中有文本列 在 df2 中有文本列 df2 的长度将与 df1 的长度不同 我想计算 df1 text 中每个条目与 df2 text 中每个条目的余弦相似度 并为每场比赛给出分数 输入样本 df1 mahesh suresh
  • Plotly:如何检查基本图形结构(版本 4)

    对于旧版本的plotly 例如在 Jupyterlab 中 您可以简单地运行figure像这样检查你的图形的基础知识 Ouput data marker color red size 10 symbol 104 mode markers l
  • 从 Flask 运行 NPM 构建

    我有一个 React 前端 我想在与我的 python 后端 API 相同的源上提供服务 我正在尝试使用 Flask 来实现此目的 但我遇到了 Flask 找不到我的静态文件的问题 我的前端构建是用生成的npm run build in s
  • 使用 PIL 在 Tkinter 中显示动画 GIF

    我正在尝试制作一个程序来使用 Tkinter 显示动画 GIF 这是我最初使用的代码 from future import division Just because division doesn t work right in 2 7 4
  • minizinc python 安装

    我通过 anaconda 提示符在 python 上安装了 minizinc 就像其他软件包一样 pip install minizinc 该软件包表示已成功安装 我可以导入该模块 但是 我正在遵循基本示例https minizinc py
  • rpy2 无法加载外部库

    希望有人能帮忙解决这个问题 R版本 2 14 1rpy2版本 2 2 5蟒蛇版本 2 7 3 一直在尝试在 python 脚本中使用 rpy2 加载 R venneuler 包 该包以 rJava 作为依赖项 venneuler 和 rJa
  • 将 Keras 集成到 SKLearn 管道?

    我有一个 sklearn 管道 对异构数据类型 布尔 分类 数字 文本 执行特征工程 并想尝试使用神经网络作为我的学习算法来拟合模型 我遇到了输入数据形状的一些问题 我想知道我想做的事情是否可能 或者我是否应该尝试不同的方法 我尝试了几种不
  • IndexError - 具有匀称形状的笛卡尔 PolygonPatch

    我曾经使用 shapely 制作一个圆圈并将其绘制在之前填充的图上 这曾经工作得很好 最近 我收到索引错误 我将代码分解为最简单的操作 但它甚至无法执行最简单的循环 import descartes import shapely geome
  • 如何(安全)将 Python 对象发送到我的 Flask API?

    我目前正在尝试构建一个 Flask Web API 它能够在 POST 请求中接收 python 对象 我使用 Python 3 7 1 创建请求 使用 Python 2 7 运行 API 该 API 设置为在我的本地计算机上运行 我试图发
  • 用于插入或替换 URL 参数的 Django 模板标签

    有人知道 Django 模板标签可以获取当前路径和查询字符串并插入或替换查询字符串值吗 例如向 some custom path q how now brown cow page 3 filter person 发出请求 电话 urlpar

随机推荐

  • c# - 易失性关键字使用与锁定

    我在不确定是否有必要的地方使用了 volatile 我很确定在我的情况下锁是多余的 阅读这篇文章 Eric Lippert 评论 让我对 volatile 的使用感到焦虑 C 中什么时候应该使用 volatile 关键字 我使用 volat
  • 如何控制下拉列表中显示的屏保名称?

    我有一个可用的屏幕保护程序 并且想了解如何控制 Windows 在屏幕保护程序下拉列表中显示的名称 目前 这一切似乎都是基于文件名 但我知道事实并非如此 这是我尝试过的方法和结果 文件名 CC Votd scr屏幕保护程序名称 Cc 文件名
  • Azure 客户端应用程序访问受 AD 保护的 Azure api

    我有一个 Angular 5 应用程序和一个 Web API 应用程序 它们都托管在 Azure 中 它们已在网站级别使用 Azure AD 进行保护 例如不允许匿名访问 浏览 Angular 网站时 它要求我正常登录 然后我就可以访问 a
  • PHP - 从字符串中删除 标签

    嘿 我需要删除字符串中的所有图像 但我找不到正确的方法 这是我尝试过的 但它不起作用 preg replace
  • DateTimeFormatter 月份模式字母“L”失败

    我注意到java time format DateTimeFormatter无法按预期解析 见下文 import java time LocalDate import java time format DateTimeFormatter p
  • 语音识别即服务。(Android)

    我正在开发 Android 应用程序 我的应用程序需要语音识别 但我需要语音识别作为服务 我已经创建了简单的语音识别 当我单击按钮时 它会启动识别器意图 它工作正常并为我提供输出 但是 当用户单击按钮语音识别作为服务启动 在后台 时 我需要
  • Mathematica 中的非交换展开除以加法

    我需要编写一个函数来完全扩展非交换乘法而不是加法 例如 a b c 2 将扩展到a b a c 2从右边开始也是如此 我正在使用 ReplaceRepeated 由于我使用的是 NonCommutativeMultiply 而不是 Time
  • Wpf 按标签和类型查找所有控件

    我正在尝试按类型和标签名称检索所有元素 我已经找到了一些例子 如何按名称或类型查找 WPF 控件 https stackoverflow com a 978352 7444801 我尝试修改其中一些示例 但是它们从未给我想要的结果 所需方法
  • 如何使用 dplyr 在行组之间进行划分

    我有类似的数据 我想要与此链接所述的确切结果 如何使用 dplyr 在行组之间进行划分 然而 与我的数据的唯一区别是 有时 条件 列并不总是有 A 或 B 因此有时没有分母或分子 x lt data frame name rep lette
  • Azure Bing Web 搜索因查询搜索而失败

    我正在使用 Odata4j 当我尝试使用查询执行简单的网络搜索时 在代码的最后一行出现以下异常 PS 如果您觉得有帮助 请投票 谢谢 java lang RuntimeException Expected status OK found B
  • NSRunningApplication,返回最近使用的应用程序列表?

    我正在尝试获取最近使用的应用程序的列表 NSWorkspace返回活动应用程序的列表 我可以使用以下几个选项对它们进行排序NSRunningApplication 参见下面的列表 launchDate finishedLaunching p
  • 如何从日期时间获取 AM/PM 值?

    有问题的代码如下 public static string ChangePersianDate DateTime dateTime System Globalization GregorianCalendar PC new System G
  • Android:使用 ContentObserver 捕获传出短信或接收器不起作用

    我试图使用内容观察器捕获传出的短信事件 TEST OBSERVER ContentObserver co new SMSoutObserver new Handler getApplicationContext ContentResolve
  • 创建一个在 React 中工作的加载动画

    Fiddle var Hello React createClass getInitialState function return gridIsLoaded true animate self console log animating
  • 编译到 LLVM IR 的 Haskell 程序缺少 main

    下列的这个帖子关于Haskell程序的编译 对于 LLVM IR 我采用了相同的 Haskell 程序并尝试运行其生成的 LLVM IR 代码 quicksort quicksort p xs quicksort lesser p quic
  • 发布数据并刷新页面

    我有一个编辑表单页面来编辑我的网站帖子 它使用 post 方法到同一页面 如果表单编译正确 则会显示一条祝贺消息 问题 当用户点击刷新按钮时 脚本会尝试将数据再次重新发布到页面 有办法避免这种情况吗 thanks Luca PRG模式的总体
  • 管理 ruby​​ gem 的冲突版本

    我正在构建一个加载用户提供的 ruby 代码的框架 它基本上是一个插件机制 我希望用户提供 ruby 代码以便能够需要自己的 gem 我打算让 插件 包包含一个包含 gem 的供应商目录 如何加载插件所需的 gem 而不使其与我的框架的 g
  • AttributeError:“NoneType”对象没有属性“excluded_of”

    我在通过 pip 安装依赖项时遇到属性错误 Traceback most recent call last File home jpg virtual env cloud lib python3 6 site packages pip in
  • 聚合、事务一致性和实体框架 DbContext

    聚合必须设计为事务性和最终一致性 实体周围的一致性边界有助于管理复杂性 在我们的存储库实现中 我们使用实体框架与实际数据库进行交互 从历史上看 我们总是拥有巨大的上下文 跨越数十个表 它们代表数据库中 或至少在数据库的某些功能区域 中的每个
  • Python timeit 的令人惊讶的结果:Counter() vs defaultdict() vs dict()

    我使用 timeit 获得了非常令人惊讶的结果 有人可以告诉我我是否做错了什么 我正在使用Python 2 7 这是文件 speedtest init py 的内容 import random to count random randint