Юлия самый быстрый способ чтения значений строки в массив - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть массив из нескольких строк, чьи значения на самом деле являются массивами разных типов, например:

Julia> _string
"[(-33.8800966, 151.2069034), (-33.8801202, 151.2071933), (-33.8803442, 151.2083656), (-33.8804469, 151.2088682), (-33.8788247, 151.2104533)]"

Julia> typeof(_string)
String

Julia> _string2
"[1, 2, 3, 4]"

Julia> typeof(_string2)
String

Я бы хотел быстро преобразовать их в массивы, я знаю тип каждой строки должен быть заранее.

то есть так

Julia> convert(Array{Tuple(Float64, Float64)}, _string)
(-33.8800966, 151.2069034), (-33.8801202, 151.2071933), (-33.8803442, 151.2083656), (-33.8804469, 151.2088682), (-33.8788247, 151.2104533)]

Julia> convert(Array{Int,1}, _string2)
[1, 2, 3, 4]

В настоящее время я использую eval(Meta.parse(_string)), что очень медленно, когда повторяется миллионы раз.

Что такое быстрый способ быстро прочитать эти строки в массивы?

1 Ответ

3 голосов
/ 07 апреля 2020

Вероятно, это не лучший ответ, но один из способов ускорить его - это проанализировать строки, используя любую информацию об их структуре, которую вы имеете, например, для вашего второго примера:

julia> using BenchmarkTools

julia> @btime parse.(Int64, split(replace(replace($_string2, "[" => ""), "]" => ""), ","))
  995.583 ns (19 allocations: 944 bytes)
4-element Array{Int64,1}:
 1
 2
 3
 4

Что сравнивается с

julia> @btime eval(Meta.parse($_string2))
  135.553 μs (43 allocations: 2.67 KiB)
4-element Array{Int64,1}:
 1
 2
 3
 4

на моей машине.

Насколько это возможно, конечно, будет зависеть от того, сможете ли вы таким образом быстро найти шаблоны для всех ваших струн.

...