V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hiugo
V2EX  ›  程序员

如何快速顺序生成一亿个数字

  •  
  •   hiugo · 2022-05-19 01:12:57 +08:00 · 4897 次点击
    这是一个创建于 698 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rt , 从一顺序生成数字,直到一亿

    33 条回复    2022-05-20 08:17:46 +08:00
    xiadong1994
        1
    xiadong1994  
       2022-05-19 01:30:10 +08:00
    读取预先在内存中生成好的一亿个数字。占用 400M*4Byte=400MB 内存。
    westoy
        2
    westoy  
       2022-05-19 01:41:16 +08:00 via Android
    mmap+seek+tell ?
    yousabuk
        3
    yousabuk  
       2022-05-19 01:41:51 +08:00 via iPhone   ❤️ 1
    @xiadong1994 算得好,你咋算的?
    yousabuk
        4
    yousabuk  
       2022-05-19 01:50:12 +08:00 via iPhone
    分配 100M 个 U32 (内存:100M * 4Byte = 400MB )

    分成 10 个并行循环赋值各自的内存地址,应该挺快的。
    xiadong1994
        5
    xiadong1994  
       2022-05-19 02:08:31 +08:00
    @yousabuk #3 For 循环写一个呀。哈哈其实我的意思是这个提问没头没尾的,要快一律按可以预处理理解。
    thedrwu
        6
    thedrwu  
       2022-05-19 03:38:15 +08:00 via Android   ❤️ 1
    冷知识:普通 PC 单线程不到 10 分钟就能 print 出所有浮点数。
    Rocketer
        7
    Rocketer  
       2022-05-19 04:45:05 +08:00 via iPhone   ❤️ 1
    你的场景是什么?
    msg7086
        8
    msg7086  
       2022-05-19 07:56:59 +08:00 via Android
    for 循环直接写,然后编译的时候打开 simd 矢量化优化和 unroll loop 优化。再上去的话搞个多线程。
    zhuifeng1017
        9
    zhuifeng1017  
       2022-05-19 08:48:54 +08:00   ❤️ 5
    是不是问题太简单了,不知有啥应有场景
    seq 1 100000000 > seq.txt
    whenov
        10
    whenov  
       2022-05-19 08:49:21 +08:00 via Android   ❤️ 2
    什么叫生成?打印到屏幕?写入到硬盘?保存到内存?

    如果允许惰性求值的话,时间接近 0 秒
    luozic
        11
    luozic  
       2022-05-19 09:09:01 +08:00
    这个数字是什么进制的? 需要输出到哪里?
    DOLLOR
        12
    DOLLOR  
       2022-05-19 09:23:17 +08:00
    一击脱离?
    xuanbg
        13
    xuanbg  
       2022-05-19 09:27:19 +08:00
    看你用什么存储了,如果是数组、链表、栈、位图这些有序的数据结构,那就压根不需要生成。用的时候根据数据结构直接就算出来了。
    coolmenu
        14
    coolmenu  
       2022-05-19 11:34:28 +08:00   ❤️ 1
    刚看完房子那个帖子,看到这个标题,脑补成了如何快速弄到 1 亿,赶快点进一看看。。。。
    ipwx
        15
    ipwx  
       2022-05-19 11:37:56 +08:00   ❤️ 1
    ❯ time seq 1 100000000 > /dev/null
    seq 1 100000000 > /dev/null 15.53s user 0.02s system 99% cpu 15.553 total
    Kinnice
        16
    Kinnice  
       2022-05-19 11:39:36 +08:00
    @coolmenu 真看到相关帖子 @我一下,我也想
    ispinfx
        17
    ispinfx  
       2022-05-19 12:27:59 +08:00
    `list(range(100000000))` -> 2 秒
    yfugibr
        18
    yfugibr  
       2022-05-19 12:38:59 +08:00
    jaysonmac
        19
    jaysonmac  
       2022-05-19 12:57:15 +08:00 via Android
    @yousabuk 100M 个 4Byte 不等于 400MB 哦,除非按 1000 进制算。按 1024 算大概 381.5MB
    ffxrqyzby
        20
    ffxrqyzby  
       2022-05-19 13:09:26 +08:00
    @jaysonmac #19 算的挺好, 下次别算了
    Chaconne
        21
    Chaconne  
       2022-05-19 13:18:20 +08:00
    crunch 0123456789 0 9 -o test.txt
    BeautifulSoap
        22
    BeautifulSoap  
       2022-05-19 13:19:09 +08:00
    lz 简直是一击脱离的典范

    也不说这一亿个数字是拿来干嘛的,如果只是放内存里需要的时候用一下,连计算都不需要计算,直接按照规律要的时候自动计算出指定位置的数就行了。这样连空间分配都不需要了

    如果要存到文件的话,一亿个 64 位整数需要 763MB 来存储,瓶颈不会在 cpu 或内存上,而在你硬盘上
    jessun1990
        23
    jessun1990  
       2022-05-19 14:19:06 +08:00
    time seq 1 100000000 > /dev/null

    ________________________________________________________
    Executed in 612.18 millis fish external
    usr time 588.62 millis 125.00 micros 588.50 millis
    sys time 23.32 millis 50.00 micros 23.27 millis

    @ipwx 请问你用的是 mac 吗? 我的输出格式与你的不一样,我用的是 manjaro 。
    ipwx
        24
    ipwx  
       2022-05-19 15:04:25 +08:00
    @jessun1990 是 mac 。看起来 Linux 做了优化,>/dev/null 不用过系统调用。mac 实打实系统调用花了 17 秒
    suyuyu
        25
    suyuyu  
       2022-05-19 15:11:10 +08:00
    我想看看阿 3 的想法
    084
        26
    084  
       2022-05-19 15:45:55 +08:00
    (base)  ~/ time seq 1 100000000 > /dev/null
    seq 1 100000000 > /dev/null 19.66s user 0.06s system 99% cpu 19.807 total
    084
        27
    084  
       2022-05-19 15:46:19 +08:00
    @084 #26 黑果请求一战
    ipwx
        28
    ipwx  
       2022-05-19 15:54:57 +08:00
    @jessun1990 顺便我的 Linux Mint 主机:

    $ time seq 1 100000000 > /dev/null

    real 0m0.544s
    user 0m0.536s
    sys 0m0.008s
    sunmker
        29
    sunmker  
       2022-05-19 15:58:17 +08:00
    ubuntu@VM-16-14-ubuntu:~$ time seq 1 100000000 > /dev/null

    real 0m0.860s
    user 0m0.812s
    sys 0m0.048s
    dangyuluo
        30
    dangyuluo  
       2022-05-19 16:08:25 +08:00
    定义快速
    wangweiggsn
        31
    wangweiggsn  
       2022-05-19 17:22:25 +08:00
    我来个 Excel 版本的吧,2007 及以上版本都 ok 。
    左上角地址栏写 A:EA ,回车,这片区域被选中,编辑栏写公式:=ROW()+1048576*(COLUMN()-1) 然后按 ctrl+Enter ,我 i5-10210U+16G 内存配置,等 30 秒左右 OK ,1.37 亿个数据纵向整齐排列了。要横向的改下公式就行,很容易。需要的话保存文件为自己需要的格式即可。过程中电脑内存和 cpu 会基本占满,建议 公式-计算选项,选手动,否则算完后 CPU 占用率仍然较高。
    tramm
        32
    tramm  
       2022-05-19 17:38:17 +08:00
    我也来一个:
    申请 1 亿个长度的 char 数组.
    其每个元素的内存地址就是你要的.
    documentzhangx66
        33
    documentzhangx66  
       2022-05-20 08:17:46 +08:00
    time seq 1 100000000 > x.log

    real 0m25.580s
    user 0m2.975s
    sys 0m4.955s
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1679 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 16:45 · PVG 00:45 · LAX 09:45 · JFK 12:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.