В Julia, как можно преобразовать список десятичных знаков ASCII в строку? - PullRequest
0 голосов
/ 04 марта 2019

tldr: Я хочу преобразовать [125, 119, 48, 126, 40] в строку вывода, }w0~(


Чтобы привести пример из реальной жизни, я работаю с данными последовательности в формате fastq( Вот ссылка на импортированную библиотеку ).

cat example.fastq выводит следующее:

@some/random/identifier
ACTAG
+
}w0~(

Приведенный ниже код julia демонстрирует чтение файла fastq:

import BioSequences.FASTQ


fastq_stream = FASTQ.Reader(open("example.fastq", "r"))
for record in fastq_stream
    # Still need to learn, why this offset of 33?
    println(
        Vector{Int8}(FASTQ.quality(record, :sanger)) .+ 33
    )
    println(
        String(FASTQ.sequence(record))
    )
    println(
        String(FASTQ.identifier(record))
    )
    break
end
close(fastq_stream)

Этот код печатает следующее:

[125, 119, 48, 126, 40]
ACTAG
some/random/identifier

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

}w0~(
ACTAG
some/random/identifier

Ответы [ 2 ]

0 голосов
/ 04 марта 2019
julia> String(UInt8.([125, 119, 48, 126, 40]))
"}w0~("

Пояснение

в Julia Строки строятся с использованием набора байтов.Если вы используете ASCII, то простое сопоставление байтов является простым, и вы можете напрямую работать с необработанными данными (что также является самым быстрым способом сделать это).

Обратите внимание, что поскольку строки Julia являются неизменяемыми, при создании строки из необработанных байтов начальные байты становятся недоступными - это также означает, что в процессе создания String данные не копируются.Посмотрите на приведенный ниже пример:

julia> mybytes = UInt8.([125, 119, 48, 126, 40]);

julia> mystring = String(mybytes)
"}w0~("

julia> mybytes
0-element Array{UInt8,1}

Замечание по производительности

String с в Юлии не усвоены.В аналитических сценариях всегда рассматривайте возможность использования Symbol с вместо String с.В некоторых сценариях использование temperature=:hot вместо temperature="hot" может означать в 3 раза более короткое время выполнения.

EDIT - тест производительности

julia> using Random, BenchmarkTools;Random.seed!(0);

bb = rand(33:126,1000);

julia> @btime join(Char.($bb));
  31.573 μs (13 allocations: 6.56 KiB)

julia> @btime String(UInt8.($bb));
  711.111 ns (2 allocations: 2.13 KiB)

String(UInt8.($bb)) более чем в 40 раз быстрее и использует 1/3памяти

0 голосов
/ 04 марта 2019

Я нашел подходящее решение на данный момент.Я уверен, что есть более эффективные решения.

join(Char(i) for i in Vector{Int8}(FASTQ.quality(record, :sanger)) .+ 33) производит вывод, который мне нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...