comando tee - pode interferir na execução de um programa ?

23 views
Skip to first unread message

Fabio Bairros

unread,
Oct 26, 2021, 6:29:47 AM10/26/21
to python...@googlegroups.com

 Saudações.

Estou usando o tee para salvar um experimento de medição de tempo de comandos e funções no python. Ou seja, "executo" um programa em python que faz 100 amostragens do tempo de execução de uma função e salvo em arquivo através do tee. Gostaria de saber se isso pode interferir na performance ou atrapalhar a medida de tempo.

Caso sim, como posso salvar as medições de outra maneira ? 





att,
Fabio Bairros

Marcelo Valle

unread,
Oct 26, 2021, 6:56:29 AM10/26/21
to Python Brasil
Seria mais fácil ajudar se você mostrar a linha de comando que está executando e porque você acha que pode estar tendo impacto de tempo.
Você não conseguiria colocar uma linha de comando de exemplo?

--
--
------------------------------------
Grupo Python-Brasil
https://wiki.python.org.br/AntesDePerguntar
 
<*> Para visitar o site do grupo na web, acesse:
http://groups.google.com/group/python-brasil
 
<*> Para sair deste grupo, envie um e-mail para:
python-brasi...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "Python Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para python-brasi...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/python-brasil/CALZ%2BQOrQhKyw-GQxCYmzfMVBv-ijXF%3D56B3v%3Dm7hDow%3D%2B6W1rQ%40mail.gmail.com.

Fabio Bairros

unread,
Oct 26, 2021, 7:06:26 AM10/26/21
to python...@googlegroups.com
Obrigado pelo retorno, Marcelo.
Segue abaixo a linha de comando:

python3 p.py | tee arquivo.txt

Na verdade não tenho ideia se o tee está impactando ou não na medição. Em algum momento que rodei me pareceu que os tempos mudaram um pouco - entre com e sem tee, mas pode ter ocorrido por alguma outra razão. O ideal era "rodar" o p.py o mais "livre" possível, sem nada do SO em paralelo (ou o mínimo possível). Não sei se o tee primeiro aguarda a execução do p.py e depois coleta os dados impressos ou se faz em concomitância.


Obrigado
Fabio Bairros


Victor Sartori

unread,
Oct 26, 2021, 7:14:44 AM10/26/21
to python...@googlegroups.com
Use o comando time.
time python3 p.py

Com e sem o tee

Em teoria não deve atrapalhar. Nada, pois vc está enviando o stdout para o stdin de outro processo.

Marcelo Valle

unread,
Oct 26, 2021, 7:54:07 AM10/26/21
to Python Brasil
Fabio, 

Esse sinal, `|`, chama `pipe`. Ele indica que você está passando a saída do primeiro comando para a entrada do segundo. 
Então o segundo comando irá ler da entrada a saída do segundo, como se você estivesse digitando a mesma coisa no seu teclado.

Para que o segundo comando possa executar, o primeiro precisa executar por inteiro e gerar saída. 

Isso significa que as medições ocorrerão antes do `tee` ser executado, de forma que acho extremamente improvável que o comando esteja impactando nas medições. 

O segundo comando será executado conforme a saída for produzida no primeiro, então se as medições demorarem muito, até é possível que o tee seja executado depois da primeira medição, por exemplo. Não creio que seja o seu caso, mas se você quiser garantir que isso não ocorra, você pode usar print no seu programa python depois que tudo já foi feito.

Agora, o que o tee faz? Ele simplesmente pega a saída do seu comando python e escreve em um arquivo. Escrever para um arquivo leva tempo, depende da velocidade do seu disco, mas normalmente há otimizações de sistema operacional que acumulam uma grande quantidade de dados em memória para escrever de uma vez para o disco, então é bem improvável que isso esteja impactando seu programa também. 

Em resumo, eu duvido que o comando tee esteja impactando suas medições, mas se quiser ter 100% de certeza, realize todas as medições antes de gerar qualquer saída no seu programa python. 

Pra saber mais sobre o pipe - voce pode ler isso aqui https://semanickz.wordpress.com/2020/04/03/linux-aprender-comandos-gnu-e-pipes/

Abraços,
Marcelo.


Professor Paiva

unread,
Oct 26, 2021, 10:14:49 AM10/26/21
to python...@googlegroups.com
Caro Fábio,

O Tee é um processo que disputa a CPU com o seu programa Python, que é outro processo com execução em paralelo com os demais.

Paiva

Sinval Júnior

unread,
Oct 26, 2021, 10:41:38 AM10/26/21
to python...@googlegroups.com
Salve os tempos em uma dict e depois registre em um arquivo txt, talvez um csv, é importante que o código fique modularizado,
tempos = {}
dat_inicio
func_teste1()
dat_fim

tempo = dat_inicio - dat_fim
tempos["func_teste1"] = tempo

Os tempos de execução sempre tendem a variar bastante, uma boa estratégia para mensurar a performance e qualidade de seu código é por meio do Big O Notation.

Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+


--

Sinval Júnior

unread,
Oct 26, 2021, 10:45:32 AM10/26/21
to python...@googlegroups.com
O pipe (|) apenas redireciona a saída de um comando para outro, execução não será em paralelo.


Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Marcelo Valle

unread,
Oct 26, 2021, 11:10:32 AM10/26/21
to Python Brasil
A execução até pode ocorrer em paralelo galera, pois o segundo comando irá consumir a entrada conforme o primeiro programa produzir saída. 
Por isso eu disse que pra garantir que não afete as medições, o que dá pra fazer e não produzir output enquanto as medições ocorrem. 

Fabio Bairros

unread,
Oct 26, 2021, 12:55:59 PM10/26/21
to python...@googlegroups.com
Boa tarde, Paiva e agradeço o retorno.

Certo, e tens alguma sugestão de como capturar os dados depois de impressos na sua totalidade ?
Acredito que ctrl-c, diretamente no terminal, não funcionaria, certo ?



Obrigado
Fabio Bairros


Em ter., 26 de out. de 2021 às 11:14, Professor Paiva <paiva.p...@gmail.com> escreveu:

Sinval Júnior

unread,
Oct 26, 2021, 12:57:16 PM10/26/21
to python...@googlegroups.com
Para execução em paralelo é necessário usar o Parallel [1][2], o texto inclusive cita o comando "tree".



Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Lucas Brahm

unread,
Oct 26, 2021, 1:02:41 PM10/26/21
to python...@googlegroups.com
Acredito que quando falaram de execução em paralelo, foi algo do tipo:

tail -f /var/log/syslog | grep python

Tanto o tail quanto o grep estarão rodando em paralelo.

Sinval Júnior

unread,
Oct 26, 2021, 1:11:21 PM10/26/21
to python...@googlegroups.com
Não, será tudo sequencial [1], paralelo é quando os programas são executados ao mesmo tempo, ou quase ao mesmo tempo e para tanto, usando BASH, seria necessário utilizar o Parallel [2].





Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Lucas Brahm

unread,
Oct 26, 2021, 1:16:35 PM10/26/21
to python...@googlegroups.com
Sinval, conforme [1]:

" Note the word "immediately"! I point this out because we who use Bash for casual scripting tend to think of our commands as synchronous, our scripts as completely sequential. We expect pipes to execute the left command, and pass it's output into the following command. But pipes use forking, and the commands are actually executed in parallel. For many commands this fact is functionally inconsequential, but sometimes it matters. For example, check out the output of: ps | cat.  Jan 17 '14 at 22:37"


Professor Paiva

unread,
Oct 26, 2021, 1:21:11 PM10/26/21
to python...@googlegroups.com
Fabio,

Vou analisar aqui e te respondo diretamente no seu e-mail.

Paiva

Marcelo Valle

unread,
Oct 27, 2021, 6:57:31 AM10/27/21
to Python Brasil
Eu ia comentar o mesmo - todos os programas são executados em paralelo, mas os programas subsequentes no pipe ficam em estado "WAITING" esperando o programa anterior produzir saída.  Isso significa que, apesar de o processo estar carregado em memória, ciclos de CPU só serão usados se houver saída produzida pelo programa anterior.

Sinval Júnior

unread,
Oct 27, 2021, 2:44:51 PM10/27/21
to python...@googlegroups.com
Sim, mas é um novo "forking", o processo seguinte precisa aguardar a resposta do primeiro, este é o objetivo do "pipe" |.


 
Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Sinval Júnior

unread,
Oct 27, 2021, 3:54:16 PM10/27/21
to python...@googlegroups.com
Sim, e é possível isso poderá ser comprovado executando o seguinte comando
ps -aux | cat

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   8964   408 ?        Ssl  16:47   0:00 /init
root         8  0.0  0.0   9052   228 tty1     Ss   16:47   0:00 /init
xxx        9  0.1  0.0  18084  3600 tty1     S    16:47   0:00 -bash
xxx        31  0.0  0.0  18904  2056 tty1     R    16:49   0:00 ps -aux
xxx        32  0.0  0.0  15420   936 tty1     S    16:49   0:00 cat
 
Observe o "STATE" do processo "cat", R, ou seja, "interruptible sleep (waiting for an event to complete)"

Ao encaminhar esta mensagem, por favor:
1 - Apague meu endereço eletrônico;
2 - Encaminhe como Cópia Oculta (Cco ou BCc) aos seus destinatários. Dificulte assim a disseminação de vírus, spams e banners.

#=================================================================+
#!/usr/bin/env python
nome = 'Sinval Júnior'
email = 'sinvalju arroba gmail ponto com'
print nome
print email
#==================================================================+

Reply all
Reply to author
Forward
0 new messages