跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 问个 Python 性能相关的
未分類
24 6 月 2020

问个 Python 性能相关的

问个 Python 性能相关的

資深大佬 : zckun 3

有很多个学校,具体就先用一千万吧,每个学校有很多个班级,每个班有很多组男女生(男女成对出现,男女生数量相等)。

现在要求每个班里的男女生的某个差,比如身高、年龄,只需要知道这里会有点耗时,最后按班级吧结果输出到文件

要求用 python 实现,对速度有要求

大佬有話說 (23)

  • 資深大佬 : wuwukai007

    pandas

  • 資深大佬 : HashV2

    这里性能应该是 sql 相关吧

  • 資深大佬 : Jackeriss

    这是算法题还是什么?好奇怪的需求

  • 資深大佬 : BBrother

    用 numpy 和 numba 来实现,但是我没自己试过

  • 資深大佬 : sss495088732

    from aioelasticsearch import Elasticsearch
    0.0

  • 資深大佬 : Hstar

    从题目看, 学校数据毫无意义,反正是按班级 group by
    题干也不是很清晰,实际遇到这种千万~亿级的数据就是直接丢进 es,和 python 毫无关系

  • 資深大佬 : Vegetable

    离开 Python 好球区了。如果你采用循环读一个处理一个的方式的话,效率太低了,可能都没有 SQL 快。
    1000W*10 班级*30*学生,这是 30 亿级别的数据,家用电脑已经无法直接读取到内存里了。如果只是流式处理的话,SQL 查出来的其实就是结果了,python 只负责写文件而已。

  • 主 資深大佬 : zckun

    @Vegetable 我是按每个班级处理的,八个进程,一共有 1500 多个班级,68w 名学生,numpy+pandas 计算用是 93 分钟

  • 主 資深大佬 : zckun

    @Hstar 没办法,人家就是要用 python,而且还要快

  • 資深大佬 : superrichman

    @zckun 把代码贴出来,看怎么优化

  • 資深大佬 : helloworld000

    这种都没有 dependence 的就直接上 spark 或者 hadoop 来算要快很多

  • 資深大佬 : Nich0la5

    这个级别数据用 cython,不过这已经不算 python 了。原生循环有多慢跑个 1e8 就知道了

  • 資深大佬 : Vegetable

    @zckun #8 你这个 68w 学生用时 93 分钟,处理 1w 人需要一分多钟应该是代码有问题了,不应该的,给个 demo 大家才好出主意在代码上优化

  • 資深大佬 : jimrok

    Vaex,可以看看 https://mp.weixin.qq.com/s/uGGucS4m2FDGobN5DTXrMw,没试过。

  • 主 資深大佬 : zckun

    @Vegetable 。。。优化到了 9 分钟,查找部分该用二分的,笨了点

  • 主 資深大佬 : zckun

    @jimrok 谢谢老哥

  • 資深大佬 : BiteTheDust

    需要查询的话 预处理好数据然后做 hash 表 然后每次去查表就行了 1e7 的数据应该不会很慢
    其实这个对语言没啥特别的要求

  • 資深大佬 : wangyzj

    pandas 吧

  • 資深大佬 : no1xsyzy

    愈发看不懂了,“要求每个班里的男女生的某个差”是笛卡尔积求出差矩阵还是均差?
    为什么会发生二分查找?中间发生了什么?

  • 資深大佬 : lithbitren

    什么鬼,数据才 68 万,遍历一轮数据记录把男女身高总和和个数装进字典,然后遍历字典计算差指输出,最多不超过半秒。
    主三十亿个学生是够吓人的,几十分钟是要的。

  • 資深大佬 : lithbitren

    students = [
    ㅤ{
    ㅤㅤ’class’: random.randrange(2000),
    ㅤㅤ’sex’: random.randint(0, 1),
    ㅤㅤ’height’: random.randrange(150, 190)
    ㅤ}
    ㅤfor _ in range(1_000_000)
    ]

    collect = collections.defaultdict(lambda: {
    ㅤ’maleSum’: 0,
    ㅤ’maleCount’: 0,
    ㅤ’femaleSum’: 0,
    ㅤ’femaleCount’: 0
    })

    for student in students:
    ㅤif student[‘sex’]:
    ㅤㅤcollect[student[‘class’]][‘maleSum’] += student[‘height’]
    ㅤㅤcollect[student[‘class’]][‘maleCount’] += 1
    ㅤelse:
    ㅤㅤcollect[student[‘class’]][‘femaleSum’] += student[‘height’]
    ㅤㅤcollect[student[‘class’]][‘femaleCount’] += 1

    result = [
    ㅤClass[‘maleSum’] / Class[‘maleCount’] – Class[‘femaleSum’] / Class[‘femaleCount’]
    ㅤfor Class in collect.values()
    ]

    测了测,百万级数据查询时间肯定不超过半秒,这还是用带键名的,如果把临时字典换成数组,估计还能再将快几倍,拆分数组类型到 numpy 然后开 numba,估计还能再快几倍,几十分钟居然就真等了。。。

  • 資深大佬 : necomancer

    numpy 就可以。anaconda 的 numpy 有 MKL 加速。比如身高,data->(10, 5, 50, 2) 型的数组-> 10 所学校,每个学校 5 个班级,等量男女各 50 人两组身高,只要 np.mean(data, axis=(0,1)) 就是按学校和班级做平均。你还需要什么统计量 numpy 都有现成函数。

  • 資深大佬 : linvaux

    @sss495088732 6 的不行

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具