代码之家  ›  专栏  ›  技术社区  ›  astropanic

如何将整数数组快速打印到控制台中?

  •  0
  • astropanic  · 技术社区  · 14 年前

    我有一个整数数组

    a = [1,2,3,4]
    

    当我这样做的时候

    a.join
    

    Ruby内部调用 to_s 方法4次,对我来说太慢了。

    向控制台输出大整数数组的最快方法是什么?

    我的意思是:

    a = [1,2,3,4........,1,2,3,9], should be: 
    

    1234………1239

    5 回复  |  直到 14 年前
        1
  •  2
  •   Steve Weet    14 年前

    如上述评论所述,如果 Fixnum.to_s 没有足够快的执行速度,那么您真的需要考虑Ruby是否是这个特定任务的正确工具。

    但是,您可以做一些事情,这些事情可能适用于您的情况,也可能不适用于您的情况。

    如果数组的生成发生在时间关键区域之外,则生成该数组,或者使用字符串而不是整数生成数组的副本。用我对10000个整数的小测试,这大约快了5倍。

    如果你同时控制阅读和写作过程,那么使用 Array.pack 写入输出和 String.unpack 读取结果。这可能不会像pack所说的那么快 Fixnum.to_int 即使元素已经是整数。

    我希望这些数字在Ruby的每个版本中都会有所不同,所以值得检查您的特定目标版本。

        2
  •  3
  •   Jörg W Mittag    14 年前

    如果要将整数打印到stdout,则需要首先将其转换为字符串,因为这是stdout所能理解的全部内容。如果要将两个整数打印到stdout,则需要首先将它们都转换为字符串。如果要将三个整数打印到stdout,则需要首先将它们全部转换为字符串。如果要将10亿个整数打印到stdout,首先需要将10亿个整数全部转换为字符串。

    你,我们,或者Ruby,或者任何编程语言都不能做到这一点。

    您可以尝试通过执行懒惰的流实现将转换与I/O交错。您可以尝试并行执行转换和I/O,方法是执行一个延迟流实现,并将转换和I/O分离为两个单独的线程。(一定要使用Ruby实现,它实际上可以 执行 并行线程,并非所有线程都可以:例如,mri、yarv和rubinius不能。)

    您可以通过并行地在单独的线程中转换数组中的单独块来并行转换。你甚至可以购买十亿个核心机器,同时并行转换所有十亿个整数。

    但即便如此,问题仍然存在:每个整数都需要转换。无论你是先一个接一个地做,然后打印它们,还是一个接一个地与I/O交错,或者一个接一个地与I/O并行,或者甚至在十亿个核心CPU上同时转换它们:所需转换的数量不会神奇地减少。大量的整数意味着大量的转换。即使在10亿个核心CPU中并行进行10亿次转换, 仍然 十亿次转换,即十亿次呼叫 to_s .

        3
  •  0
  •   FRotthowe    14 年前

    你的进度慢不是因为 to_s 被调用4次,但从打印到控制台。控制台输出速度很慢,您不能真正对此做任何事情。

        4
  •  0
  •   John La Rooy    14 年前

    对于单个数字,您可以这样做

    [1,2,3,4,5].map{|x|(x+48).chr}.join
    

    如果你需要加速更大的数字,你可以尝试记忆 to_s

        5
  •  0
  •   Rob Jones    14 年前

    除非您真的需要查看控制台上的数字(听起来您不需要),否则将它们以二进制的形式写入一个文件——应该要快得多。

    如果您需要这样做,您可以将二进制文件导入其他程序,而不仅仅是文本。