首页 > 解决方案 > 如何在 Julia 中重复字符串中的单个字符

问题描述

这个问题展示了如何在 Python 中重复字符串中的单个字符。

>>> s = '123abc'
>>> n = 3
>>> ''.join([c*n for c in s])
'111222333aaabbbccc'

你会如何在 Julia 中做到这一点?

编辑

作为 Julia 的新手,我对这门语言所能提供的东西感到惊讶。

例如,我会认为上面的 Python 代码与任何语言的代码一样简单。但是,正如我在下面的回答所示,Julia 等效代码join([c^n for c in s])可以说更简单,并且可能达到任何语言的最佳简单性。

另一方面,@niczky12 表明,在string函数中添加省略号运算符后,速度可以比稍微简单的join函数实现的速度显着提高。

在一种情况下,朱莉娅为了简单而大放异彩。在另一种情况下,朱莉娅因速度而大放异彩。

c^n对于 Python 程序员来说,当他们注意到仅 c*n在 Python 中时,第一个案例应该几乎立即可读。当他们看到使用...省略号运算符的速度提高时,额外的复杂性可能不会阻止他们学习 Julia。读者可能开始认为我希望许多 Python 程序员会认真对待 Julia。他们不会错的。

感谢 @rickhg12hs 提出的基准测试建议。我学到了很多东西。

标签: julia

解决方案


您可以使用 Julia 推导式或生成器来完成。

julia> VERSION
v"1.0.0"

julia> s = "123abc"
"123abc"

# n is number of times to repeat each character.
julia> n = 3
3

# Using a Julia comprehension with [...]
julia> join([c^n for c in s])
"111222333aaabbbccc"

# Using a Julia generator without the [...]
julia> join(c^n for c in s)
"111222333aaabbbccc"

对于小弦,速度上应该几乎没有实际差异。

编辑

TL;DR:一般来说,生成器比理解器要快一些。但是,相反的情况参见案例 3。内存估计非常相似。

@rickhg12hs 建议有基准测试会很好。

使用出色的 BenchmarkTools 包,结果如下。

n = the number of times to repeat each character

s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" in each case

在每种情况下,首先列出的是理解中位时间 C,其次是生成器中位时间 G。时间经过四舍五入,原始数字低于编号摘要。当然,越小越好。

内存估计并没有太大差异。

1. n = 26, C=3.8 vs. G=2.8 μs, G 更快

julia> using BenchmarkTools

julia> n = 26;

julia> @benchmark join([c^n for c in s])
BenchmarkTools.Trial:
  memory estimate:  3.55 KiB
  allocs estimate:  39
  --------------
  minimum time:     3.688 μs (0.00% GC)
  median time:      3.849 μs (0.00% GC)
  mean time:        4.956 μs (16.27% GC)
  maximum time:     5.211 ms (99.85% GC)
  --------------
  samples:          10000
  evals/sample:     8

julia> @benchmark join(c^n for c in s)
BenchmarkTools.Trial:
  memory estimate:  3.19 KiB
  allocs estimate:  36
  --------------
  minimum time:     2.661 μs (0.00% GC)
  median time:      2.756 μs (0.00% GC)
  mean time:        3.622 μs (19.94% GC)
  maximum time:     4.638 ms (99.89% GC)
  --------------
  samples:          10000
  evals/sample:     9

2. n = 260, C=10.7 vs. G=8.1 μs, G 更快

julia> n = 260;

julia> @benchmark join([c^n for c in s])
BenchmarkTools.Trial:
  memory estimate:  19.23 KiB
  allocs estimate:  39
  --------------
  minimum time:     8.125 μs (0.00% GC)
  median time:      10.691 μs (0.00% GC)
  mean time:        18.559 μs (35.36% GC)
  maximum time:     43.930 ms (99.92% GC)
  --------------
  samples:          10000
  evals/sample:     1

julia> @benchmark join(c^n for c in s)
BenchmarkTools.Trial:
  memory estimate:  18.88 KiB
  allocs estimate:  36
  --------------
  minimum time:     7.270 μs (0.00% GC)
  median time:      8.126 μs (0.00% GC)
  mean time:        10.872 μs (18.04% GC)
  maximum time:     10.592 ms (99.87% GC)
  --------------
  samples:          10000
  evals/sample:     4

3. n = 2,600,C=62.3 vs. G=63.7 μs,C 更快

julia> n = 2600; 

julia> @benchmark join([c^n for c in s])
BenchmarkTools.Trial:
  memory estimate:  150.16 KiB
  allocs estimate:  39
  --------------
  minimum time:     51.746 μs (0.00% GC)
  median time:      63.293 μs (0.00% GC)
  mean time:        77.315 μs (2.79% GC)
  maximum time:     3.721 ms (96.85% GC)
  --------------
  samples:          10000
  evals/sample:     1

julia> @benchmark join(c^n for c in s)
BenchmarkTools.Trial:
  memory estimate:  149.80 KiB
  allocs estimate:  36
  --------------
  minimum time:     47.897 μs (0.00% GC)
  median time:      63.720 μs (0.00% GC)
  mean time:        88.716 μs (17.58% GC)
  maximum time:     42.457 ms (99.83% GC)
  --------------
  samples:          10000
  evals/sample:     1

4. n = 26,000,C=667 vs. G=516 μs,G 更快

julia> n = 26000; 

julia> @benchmark join([c^n for c in s])
BenchmarkTools.Trial:
  memory estimate:  1.44 MiB
  allocs estimate:  39
  --------------
  minimum time:     457.589 μs (0.00% GC)
  median time:      666.710 μs (0.00% GC)
  mean time:        729.592 μs (10.91% GC)
  maximum time:     42.673 ms (98.76% GC)
  --------------
  samples:          6659
  evals/sample:     1

julia> @benchmark join(c^n for c in s)
BenchmarkTools.Trial:
  memory estimate:  1.44 MiB
  allocs estimate:  36
  --------------
  minimum time:     475.977 μs (0.00% GC)
  median time:      516.176 μs (0.00% GC)
  mean time:        659.001 μs (10.36% GC)
  maximum time:     42.268 ms (98.41% GC)
  --------------
  samples:          7548
  evals/sample:     1

推荐阅读