julia - 如何在 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> 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
推荐阅读
- c - 如何修复 mac OS 中的 [-Wreturn-type] 错误
- android - Trying to populate my spinner with data from Firebase Realtime Database but my spinner is blank
- ruby-on-rails - 如果我直接点击“localhost:3000/404”端点,Rails config.exceptions_app 将不起作用
- c - 如何使用指针在 C 中的第一个空间上拆分字符串?
- windows - 如何在带有 gui 的 msys2 中使用 emacs
- react-native - 如何在 react-native 中创建变量并将其设置为多行 JSX 结构
- google-chrome - 带过滤器的跨浏览器 SVG 动画(Chrome 可以,不是 Firefox/Safari)
- scrapy - CLOSESPIDER_ERRORCOUNT 参数含义
- matplotlib - Matplotlib 散点图聚集在图形中间
- google-cloud-automl - 删除 AutoML Vision 数据集是否也会删除模型?