gpt4 book ai didi

arrays - 乐: is there a SUPER fast way to turn an array into a string without the spaces separating the elements?

转载 作者:行者123 更新时间:2023-12-03 16:56:52 24 4
gpt4 key购买 nike

我需要将数千个二进制字节字符串(每个大约 1 兆字节长)转换为 ASC 字符串。这是我一直在做的,而且似乎太慢了:

sub fileToCorrectUTF8Str ($fileName) { # binary file
my $finalString = "";
my $fileBuf = slurp($fileName, :bin);
for @$fileBuf { $finalString = $finalString ~ $_.chr; };
return $finalString;
}

~@b 将 @b 变成字符串,所有元素用空格分隔,但这不是我想要的。如果@b = < a b c d >; ~@b 是“a b c d”;但我只想要“abcd”,而且我想非常快地做到这一点。

那么,最好的方法是什么?我不能真正使用 hyper 进行并行处理,因为最终的字符串是按顺序构造的。或者我可以吗?

最佳答案

TL;DR 在旧乐道上,.decode大约快 100 倍。

以更长的形式匹配您的代码:

sub fileToCorrectUTF8Str ($fileName) { # binary file
slurp($fileName, :bin).decode
}

性能说明

首先,这是我为测试而写的:
# Create million and 1 bytes long file:
spurt 'foo', "1234\n6789\n" x 1e5 ~ 'Z', :bin;

# (`say` the last character to check work is done)
say .decode.substr(1e6) with slurp 'foo', :bin;

# fileToCorrectUTF8Str 'foo' );

say now - INIT now;

在 TIO.run 的 2018.12乐道,以上 .decode重约 .05每百万字节文件的秒数,而不是大约 5秒为您的解决方案。

您当然可以/应该在您的系统上进行测试和/或使用更高版本的 rakudo。我希望差异保持相同的顺序,但是随着时间的流逝,绝对时间会显着改善。 [1]

为什么它快 100 倍?

好吧,首先, @Buf/ Blob显式强制 raku 将以前的单个项目( 一个 缓冲区)视为复数(元素列表又名多个项目 s )。这意味着高级迭代,对于一百万个元素缓冲区,立即是一百万个高级迭代/操作,而不仅仅是一个高级操作。

二、使用 .decode不仅避免了迭代,而且每个文件只产生一次相对较慢的方法调用开销,而在迭代时可能有一百万 .chr每个文件的调用。方法调用(至少在语义上) late-bound与例如调用 sub 而不是方法(sub 通常是早期绑定(bind)的)相比,这在原则上是相对昂贵的。

都说:
  • 记住警告空[1]。例如,rakudo 的标准类会生成方法缓存,编译器可能只是内联方法,因此方法调用方面的开销可能可以忽略不计。
  • 另请参阅文档的 Performance页,尤其是 Use existing high performance code .

  • Buf.Str错误信息 LTA ?

    更新 请参阅 Liz++ 的评论。

    如果您尝试使用 .StrBufBlob (或等效的,例如使用 ~ 前缀)你会得到一个异常(exception)。目前消息是:
    Cannot use a Buf as a string, but you called the Str method on it

    doc for .Str on a Buf / Blob 目前说:

    In order to convert to a Str you need to use .decode.



    可以说是 LTA 错误消息并没有暗示同样的事情。

    再说一次,在决定对此采取什么措施之前(如果有的话),我们需要考虑人们可以从任何错误中学习什么以及如何学习,包括有关它的信号,例如错误消息,以及他们在其中做什么和如何做事实上,目前我们正在学习,并将我们的 react 偏向于建立正确的文化和基础设施。

    特别是,如果人们可以轻松地将他们看到的错误消息与对其进行详细说明的在线讨论联系起来,则需要考虑并鼓励和/或使其变得更容易。

    例如,现在有这个 SO 涵盖了这个问题,其中包含错误消息,所以谷歌可能会在这里找到某人。依靠它可能是比更改错误消息更合适的前进道路。或者它可能不会。改变会很容易...

    请考虑在下面发表评论和/或搜索现有的 rakudo issues看看 Buf.Str 有没有改善正在考虑错误消息和/或您是否希望打开一个问题以建议对其进行更改。每移动一 block 石头至少是一次很好的锻炼,随着我们的集体努力变得越来越明智,(我们的观点) the mountain .

    脚注

    [1] 正如著名的拉丁语“Caveat Empty”所说,任何特定 raku 功能以及更普遍地任何特定代码的绝对和相对性能总是会因系统功能、其在运行期间的负载等因素而发生变化运行代码,以及编译器完成的任何优化。因此,例如,如果您的系统是“空的”,那么您的代码可能会运行得更快。或者,作为另一个例子,如果您等待一到三年让编译器变得更快, advances in rakudo's performance continue to look promising .

    关于arrays - 乐: is there a SUPER fast way to turn an array into a string without the spaces separating the elements?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60334347/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com