Язык Julia: перенаправление stdout влияет не на все println // Как извлечь значение из stdout - PullRequest
2 голосов
/ 20 октября 2019

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

julia> OneSampleTTest([1,2,3,4,5],3.1)
One sample t-test
-----------------
Population details:
    parameter of interest:   Mean
    value under h_0:         3.1
    point estimate:          3.0
    95% confidence interval: (1.0368, 4.9632)

Test summary:
    outcome with 95% confidence: fail to reject h_0
    two-sided p-value:           0.8944

Details:
    number of observations:   5
    t-statistic:              -0.14142135623730961
    degrees of freedom:       4
    empirical standard error: 0.7071067811865476

Я хотел заполучить это значение:

two-sided p-value: 0.8944

Чтобы перенаправить стандартный вывод, я нашел this на нашем сайте здесь. Но, похоже, это не влияет на вывод OneSampleTTest.

julia> using HypothesisTests

julia> original_stdout = stdout
Base.TTY(RawFD(0x0000001b) open, 0 bytes waiting)

julia> (rd, wr) = redirect_stdout()
(Base.PipeEndpoint(RawFD(0x00000020) open, 0 bytes waiting), Base.PipeEndpoint(RawFD(0x00000025) open, 0 bytes waiting))

julia> println("test")

julia> s = readline(rd)
"test"

julia> s == "test"
true

julia> OneSampleTTest([1,2,3,4,5],3.1)
One sample t-test
-----------------
Population details:
    parameter of interest:   Mean
    value under h_0:         3.1
    point estimate:          3.0
    95% confidence interval: (1.0368, 4.9632)

Test summary:
    outcome with 95% confidence: fail to reject h_0
    two-sided p-value:           0.8944

Details:
    number of observations:   5
    t-statistic:              -0.14142135623730961
    degrees of freedom:       4
    empirical standard error: 0.7071067811865476


julia> 

И если бы он сделал еще один s = readline(rd), он застрял бы, потому что в rd ничего нет. (Я предполагаю)

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

Ответы [ 2 ]

3 голосов
/ 20 октября 2019

Я бы посоветовал доверить Джулии и вашей ОС быстрое выполнение таких задач и попытаться оптимизировать только после того, как возникнет узкое место.

Следующий код выводит p-значения в виде строк в текстовый файл без какого-либо перенаправления stdout и быстро. Для миллиона итераций требуется 2,5 секунды .

 open("pvalues.txt","w") do io
    for i in 1:1000000 

        # do the test
        test = might be a better place.OneSampleTTest(rand(Int64,5),3.1)

        # transform only the pvalue of the test to a string an write it
        # take note of the function "pvalue", which extract, well, the p-value!
        write(io,string(pvalue(test),"\n"))

    end
end

Вы также можете перенести ваше обсуждение на https://discourse.julialang.org/, чтобы выяснить, может ли ваш общий подход к обработке данных бытьулучшен.

1 голос
/ 21 октября 2019

При вызове OneSampleTTest не на самом деле ничего не печатается. Если поставить точку с запятой в конце строки, вы увидите, что вывод не отображается.

julia> OneSampleTTest([1,2,3,4,5],3.1);

julia>

Что OneSampleTTest() делает, так это возвращает значение типа OneSampleTTest. Он даже не делает тест, просто создает тестовый объект. Поскольку вы не ставили точку с запятой в конце, Джулия вызовет метод Base.show, чтобы записать информативный текст об этом значении в текущий поток вывода. OneSampleTTest является подтипом HypothesisTest, который расширяет метод Base.show для записи вывода, который вы видите на своей консоли.

Если вам по какой-то причине нужно сохранить выходные данные show, вы можетеиспользуйте Base.repr, который даст вам show как String.

julia> result = repr(OneSampleTTest([1,2,3,4,5],3.1));

julia> result
"One sample t-test\n-----------------\nPopulation details:\n    parameter of interest:   Mean\n    value under h_0:         3.1\n    point estimate:          3.0\n    95% confidence interval: (1.0368, 4.9632)\n\nTest summary:\n    outcome with 95% confidence: fail to reject h_0\n    two-sided p-value:           0.8944\n\nDetails:\n    number of observations:   5\n    t-statistic:              -0.14142135623730961\n    degrees of freedom:       4\n    empirical standard error: 0.7071067811865476\n"

Обратите внимание, что вам не нужно извлекать p-значение путем анализатекст. OneSampleTTest реализует метод pvalue и простое использование pvalue на вашем тестовом объекте вычислит и вернет значение p.

julia> test = OneSampleTTest([1,2,3,4,5],3.1); # this only creates an object, does not compute p-value

julia> pvalue(test) # computes and `show`s the value
...