Это вызвано функцией JVM и, если вы не делаете взломать, например, тот, который предоставлен Marcus A., на самом деле не так просто работать. [D0] .flush () работает в этом случае, но причина этого намного сложнее в работе.
JVM умный, но также очень, очень аутичный. Когда вы программируете на Java, вы не говорите компьютеру, что делать, вы сообщаете JVM (виртуальная машина Java), что вы хотели бы сделать. И он будет делать это, но более эффективно. Ваш код не является точным подробным инструкциям, в этом случае вам нужен только компилятор, как на C и C ++, JVM берет ваш код в качестве списка спецификаций для того, что он должен оптимизировать, а затем делать. Это то, что происходит здесь. Java видит, что вы нажимаете строки в два разных потока буферов. Самый эффективный способ сделать это - буферизировать все строки, которые вы хотите передать потокам, а затем вывести их. Это происходит по одному потоку в то время, по существу преобразуя ваш код, сделав что-то вроде этого (будьте осторожны: псевдокод) :
for (int i = 0; i & lt; 5; i ++) {out.add (); err.add (); } out.flush (); err.flush ();
Поскольку это более эффективно, именно это будет делать JVM. Добавление .flush ()
в цикле будет сигнализировать JVM о необходимости промывки в каждом цикле, который не может быть улучшен с помощью вышеуказанного метода. Но если вы объясните, как это будет работать, цикл JVM изменит порядок вашего кода, чтобы сделать его последним, потому что это более эффективно.
System.out .println ( "из"); System.out.flush (); System.err.println ( "ERR"); System.err.flush (); System.out.println ( "из"); System.out.flush (); System.err.println ( "ERR"); System.err.flush ();
Этот код всегда будет реорганизован на что-то вроде этого:
System.out.println («out»); * System.err. println ("err"); * System.out.println ("out"); * System.err.println ("err"); * System.out.flush (); System.err.flush ();
Поскольку буферизация многих буферов только для их очистки сразу после того, как требуется намного больше времени, чем для буферизации всего буфера, а затем сбрасывает все это одновременно.
Здесь может возникнуть дизайн кода и архитектура; вы вроде бы не решаете этого. Чтобы обойти это, вы должны сделать его более эффективным для буферизации печати / флеша, печати буфера или флеша, чем буфер, а затем сброс. Это, скорее всего, соблазнит вас неудачным дизайном. Если для вас важно, как вывести его упорядоченно, я предлагаю вам попробовать другой подход. For-looping с .flush ()
- это один из способов взломать его, но вы все еще взламываете функцию JVM, чтобы повторно упорядочить и оптимизировать свой код для вас.
*
Я не могу проверить, что буфер, который вы добавили в первую очередь, сначала будет печататься первым, но, скорее всего, будет.
Как сказал @KyssTao, help(dates.num2date)
говорит, что x
должен быть float, дающим число дней с 0001-01-01 плюс один. Следовательно, 19910102
не 2 / янв / 1991, потому что, если вы посчитали 19910101 дней с 0001-01-01, вы получите что-то в год 54513 или подобное (разделите на 365,25, количество дней в году).
Вместо этого используйте datestr2num
(см. help(dates.datestr2num)
):
new_x = dates.datestr2num(date) # where date is '01/02/1991'
Вы можете сделать это более просто, используя plot()
вместо plot_date()
.
Сначала преобразуем ваши строки в экземпляры Python datetime.date
:
import datetime as dt
dates = ['01/02/1991','01/03/1991','01/04/1991']
x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]
y = range(len(x)) # many thanks to Kyss Tao for setting me straight here
Затем сюжет:
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()
Результат:
[/g0]