Open Sourcing Parsing
Мы рады объявить о выпуске 0.1.0 Parsing, библиотеки для преобразования туманных данных в хорошо структурированные данные. Он был создан на основе содержания 21 эпизода (10 часов), в которых мы показываем, как создать библиотеку синтаксического анализа с нуля, уделяя особое внимание композиции, производительности и универсальности:
Состав : Способность разбивать большие и сложные задачи разбора на более мелкие и простые. И возможность брать небольшие простые парсеры и легко объединять их в более крупные и сложные.
Производительность : Парсеры, состоящие из множества мелких частей, должны работать так же хорошо, как хорошо настроенные, написанные от руки парсеры.
Универсальность : Возможность анализа любых входных данных в любых выходных данных. Это позволяет вам выбирать, с какими уровнями абстракции вы хотите работать, в зависимости от того, какая производительность вам нужна или какую точность вы хотите гарантировать.
Мотивация
Синтаксический анализ — удивительно распространенная проблема в программировании. Мы можем определить синтаксический анализ как попытку взять более туманный блок данных и преобразовать его во что-то более хорошо структурированное. Стандартная библиотека Swift поставляется с несколькими парсерами, которые мы используем каждый день. Например, есть инициализаторы Int
, Double
и даже Bool
, которые пытаются анализировать числа и логические значения из строк:
Int("42") // 42 Int("Привет") // ноль Двойной ("123,45") // 123,45 Double("До свидания") // ноль Bool("истина") // истина Bool("0") // ноль
И есть такие типы, как JSONDecoder
и PropertyListDecoder
, которые пытаются анализировать Decodable
-согласованные типы из данных:
try JSONDecoder(). decode(User.self, from: data) попробуйте PropertyListDecoder().decode(Settings.self, from: data)
В то время как синтаксические анализаторы есть повсюду в Swift, у Swift нет целостной истории для синтаксического анализа. Вместо этого мы обычно анализируем данные в произвольном порядке, используя ряд несвязанных инициализаторов, методов и других средств. И это, как правило, приводит к менее удобному для сопровождения и менее пригодному для повторного использования коду.
Эта библиотека предназначена для написания такой истории для разбора в Swift. В нем представлена единая единица синтаксического анализа, которую можно комбинировать интересными способами для формирования больших и сложных синтаксических анализаторов, которые могут решать проблемы программирования, которые вам необходимо решить, удобным для сопровождения способом.
Начало работы
Предположим, у вас есть строка, содержащая некоторые пользовательские данные, которые вы хотите разобрать на массив User
s:
var input = """ 1, капля, правда 2, Блоб младший, ложь 3, Блоб-старший, правда """ структура пользователя { идентификатор переменной: Int имя переменной: строка var isAdmin: Логический }
Наивным подходом к этому было бы вложенное использование . split(separator:)
, а затем небольшая дополнительная работа по преобразованию строк в целые числа и логические значения:
let users = input .split(разделитель: "\n") .compactMap {строка -> Пользователь? в пусть поля = row.split (разделитель: ",") сторожить поля.количество == 3, пусть идентификатор = Int (поля [0]), пусть isAdmin = Bool (строка (поля [2])) иначе { вернуть ноль } вернуть пользователя (идентификатор: идентификатор, имя: строка (поля [1]), isAdmin: isAdmin) }
Этот код не только немного запутан, но и неэффективен, поскольку мы выделяем массивы для .split
, а затем сразу же отбрасываем эти значения.
Вместо этого было бы более просто и эффективно описать, как потреблять биты с начала ввода и преобразовывать их в пользователей. Это то, в чем эта библиотека парсера превосходна 😄.
Мы можем начать с описания того, что значит анализировать одну строку, сначала анализируя целое число в начале строки, а затем анализируя запятую, которую мы отбрасываем, используя . skip
оператор:
пусть пользователь = Int.parser() .скип (Начинается с ("","))
Уже это может потреблять начало ввода:
user.parse(&input) // => 1 input // => "Blob,true\n2,Blob Jr.,false\n3,Blob Sr.,true"
Далее мы хотим взять все до следующей запятой для имени пользователя, а затем пропустить запятую:
let user = Int.parser() .скип (Начинается с ("",")) .take(PrefixWhile {$0!= ","}) .скип (Начинается с ("","))
Здесь оператор .take
объединил проанализированные значения в кортеж (Int, Substring)
.
Затем мы хотим взять логическое значение в конце строки для статуса администратора пользователя:
let user = Int.parser() .скип (Начинается с ("",")) .take(PrefixWhile {$0!= ","}) .скип (Начинается с ("",")) .take(Bool.parser())
В настоящее время это будет анализировать кортеж (Int, Substring, Bool)
из ввода, и мы можем .map
, чтобы превратить его в пользователя
:
let user = Int. parser() .скип (Начинается с ("",")) .take(PrefixWhile {$0!= ","}) .скип (Начинается с ("",")) .take(Bool.parser()) .map {Пользователь (id: $0, имя: String ($1), isAdmin: $2) }
Этого достаточно, чтобы проанализировать одного пользователя из входной строки:
user.parse(&input) // => User(id: 1, name: "Blob", isAdmin: true) input // => "\n2,Клякса младший,false\n3,Кляпка старший,true"
Чтобы проанализировать несколько пользователей из ввода, мы можем использовать Многие
парсер:
пусть пользователи = Многие(пользователь, разделитель: StartsWith("\n")) user.parse(&input) // => [Пользователь(id: 1, name: "Blob", isAdmin: true), …] ввод // => ""
Теперь этот синтаксический анализатор может обрабатывать весь документ пользователей, а его код проще и понятнее, чем версия, использующая
и .compactMap
.
Более того, он более производительный. Мы написали тесты для этих двух стилей синтаксического анализа, и . split
-стиль парсинга более чем в два раза медленнее:
name time std итерации -------------------------------------------------- ---------------- README Example.Parser: Подстрока 3426 000 нс ± 63,40 % 385395 README Example.Adhoc 7631,000 нс ± 47,01 % 169332 Программа завершилась с кодом выхода: 0
Кроме того, если вы хотите написать свои парсеры для UTF8View
вместо Substring
, вы можете получить еще большую производительность, более чем удвоив скорость:
имя время стандартные итерации -------------------------------------------------- ---------------- README Example.Parser: Подстрока 3693 000 нс ± 81,76 % 349763 README Пример. Парсер: UTF8 1272 000 нс ± 128,16 % 999150 README Example.Adhoc 8504.000 нс ± 59,59 % 151417
Мы также можем сравнить это время с инструментом, который нам дает Фонд Apple: Сканер
. Это тип, который позволяет использовать с начала строки для получения значений и предоставляет более удобный API, чем использование 9. 0031 .split :
переменные пользователи: [Пользователь] = [] в то время как scan.currentIndex != input.endIndex { сторожить пусть идентификатор = сканер.scanInt(), пусть _ = сканер.scanString ("","), пусть имя = сканер.scanUpToString ("","), пусть _ = сканер.scanString ("","), пусть isAdmin = сканер.scanBool() иначе { перерыв } users.append(Пользователь(id: id, имя: имя, isAdmin: isAdmin)) _ = сканер.scanString("\n") }
Однако стиль синтаксического анализа сканера
более чем в 5 раз медленнее, чем анализатор подстрок, написанный выше, и более чем в 15 раз медленнее, чем анализатор UTF-8:
имя время стандартные итерации -------------------------------------------------- ------------------ README Example.Parser: Подстрока 3481 000 нс ± 65,04 % 376525 README Пример. Парсер: UTF8 1207 000 нс ± 110,96 % 1000000 README Example.Adhoc 8029 000 нс ± 44,44 % 163719 README Example.Scanner 19786.000 нс ± 35,26 % 62125
Это основы синтаксического анализа простого строкового формата, но есть еще множество операторов и приемов, которые необходимо изучить, чтобы эффективно анализировать большие входные данные. Просмотрите эталонные тесты для примеров реальных сценариев синтаксического анализа.
Дизайн
Протокол
Дизайн библиотеки во многом основан на стандартной библиотеке Swift и платформе Combine от Apple. Синтаксический анализатор представлен как протокол, которому соответствуют многие типы, а затем преобразования синтаксического анализатора (также известные как «комбинаторы») — это методы, которые возвращают конкретные типы, соответствующие протоколу синтаксического анализатора.
Например, чтобы проанализировать все символы от начала подстроки до запятой, вы можете использовать префикс
синтаксический анализатор:
let синтаксический анализатор = Prefix{ $0 != "," } var input = "Привет, Мир"[...] parser.parse(&input) // => "Привет" ввод // => ",Привет"
Тип этого синтаксического анализатора:
Prefix
Мы можем .map
в этом синтаксическом анализаторе, чтобы преобразовать его вывод, который в данном случае является строкой «Hello»:
let parser = Prefix{ $0 != "," } . map {$0 + "!!!" } var input = "Привет, Мир"[...] parser.parse(&input) // => "Привет!!!" ввод // => ",Привет"
Тип этого синтаксического анализатора теперь:
Parsers.Map, Substring>
Обратите внимание, как тип парсера кодирует выполняемые нами операции. Это немного усложняет использование этих типов, но дает некоторые преимущества в производительности, поскольку Swift обычно может оптимизировать создание этих вложенных типов.
Низкоуровневый и высокоуровневый
Библиотека упрощает выбор уровня абстракции, над которым вы хотите работать. Как низкоуровневые, так и высокоуровневые имеют свои плюсы и минусы.
Разбор низкоуровневых входных данных, таких как единицы кода UTF-8, имеет лучшую производительность, но ценой потенциальной потери правильности. Каноническим примером этого является попытка разобрать символ «é», который может быть представлен в кодовых единицах как [233]
или [101, 769]
. Если вы не помните всегда анализировать оба представления, у вас может возникнуть ошибка, из-за которой вы случайно выйдете из строя синтаксического анализатора, когда он встретит последовательность единиц кода, которую вы не поддерживаете.
С другой стороны, анализ входных данных высокого уровня, таких как String
, может гарантировать правильность, но за счет производительности. Например, String
справляется со сложностями расширенных кластеров графем и нормализацией UTF-8, но обход строк происходит медленнее, поскольку его элементы имеют переменную ширину.
Библиотека предоставляет инструменты, позволяющие выбирать уровень абстракции, над которым вы хотите работать, а также возможность плавного перехода между уровнями абстракции там, где это целесообразно.
Например, мы хотим разобрать названия конкретных городов с начала строки:
перечисление Город { кейс лондон случай Нью-Йорк дело Сан-Хосе }
Поскольку «Сан-Хосе» имеет акцентированный символ, самый безопасный способ его анализа — анализ на уровне абстракции Substring
:
let city = StartsWith("London"). map { City.london } .orElse(StartsWith("Нью-Йорк").map { .newYork}) .orElse(StartsWith("Сан-Хосе").map { .sanJose}) var input = "Сан-Хосе, 123" city.parse(&input) // => City.sanJose ввод // => ",123"
Однако мы берем на себя затраты на синтаксический анализ Подстроки
для всего этого синтаксического анализатора, несмотря на то, что эта мощность требуется только для случая «Сан-Хосе». Мы можем реорганизовать этот синтаксический анализатор так, чтобы «Лондон» и «Нью-Йорк» анализировались на уровне UTF8View
, поскольку они состоят только из символов ASCII, а затем анализировались «Сан-Хосе» как Substring
:
let city = StartsWith ("Лондон".utf8).map { City.london } .orElse(StartsWith("Нью-Йорк".utf8).map { .newYork}) .orElse(StartsWith("Сан-Хосе").utf8.map { .sanJose})
Это тонко, но StartsWith("London".utf8)
— это синтаксический анализатор, который анализирует единицы кода для «London» с начала UTF8View
, тогда как StartsWith("San José"). utf8
анализирует «Сан-Хосе» как Substring
, а затем преобразует его в парсер UTF8View
.
Это позволяет вам анализировать как можно больше на более производительном низкоуровневом UTF8View
, в то же время позволяя вам анализировать более правильный высокоуровневый Подстрока
при необходимости.
Эталонные тесты
Эта библиотека поставляется с исполняемым файлом эталонного теста, который не только демонстрирует производительность библиотеки, но также предоставляет множество примеров анализа:
- URL-маршрутизатор
- Журналы испытаний Xcode
- Упрощенный CSV
- Шестнадцатеричный цвет
- ISO8601 дата
- HTTP-запрос
- Упрощенный JSON
- Арифметическая грамматика
- и более
Это время, которое мы сейчас получаем при выполнении тестов:
MacBook Pro (16 дюймов, 2019 г.) 8-ядерный процессор Intel Core i9 с тактовой частотой 2,4 ГГц 64 ГБ 2667 МГц DDR4 итерации стандартного времени имени -------------------------------------------------- -------------------------------------------------- Arithmetic. Parser 12622.000 нс ± 40,63 % 102408 BinaryData.Parser 512 000 нс ± 172,80 % 1000000 Bool.Bool.init 28 000 нс ± 880,63 % 1000000 Bool.BoolParser 43 000 нс ± 423,22 % 1000000 Bool.Scanner.scanBool 920 000 нс ± 119,49 % 1000000 Color.Parser 127 000 нс ± 341,57 % 1000000 CSV.Parser 1370906,000 нс ± 12,24 % 1027 Методы мутации CSV.Ad hoc 1338824,500 нс ± 13,91 % 1014 Date.Parser 12 429 000 нс ± 38,26 % 107 342 Date.DateFormatter 41168.000 нс ± 29,40 % 31353 Date.ISO8601DateFormatter 56236,000 нс ± 27,39% 23383 HTTP.HTTP 3850 000 нс ± 1898,35 % 341642 JSON.Parser 6 115 000 нс ± 45,95 % 217 152 JSON.JSONSerialization 3050 000 нс ± 71,43 % 431524 Numerics.Int.init 38 000 нс ± 655,10 % 1000000 Numerics.Int.parser 41 000 нс ± 464,80 % 1000000 Numerics.Scanner.scanInt 145 000 нс ± 22359.78 % 1000000 Числовые значения. Разделенные запятыми: Int.parser 5511505,000 нс ± 8,87 % 245 Числовые значения. Разделенные запятыми: Scanner.scanInt 82824843,000 нс ± 2,37 % 17 Числовые значения. Разделенные запятыми: String. split 117376272,000 нс ± 2,68 % 11 Numerics.Double.init 58 000 нс ± 518,12 % 1000000 Numerics.Double.parser 59 000 нс ± 445,11 % 1000000 Numerics.Scanner.scanDouble 195 000 нс ± 234,94 % 1000000 Числовые значения. Разделенные запятыми: Double.parser 6222693,000 нс ± 9,33 % 220 Числовые значения. Разделенные запятыми: Scanner.scanDouble 89431780,500 нс ± 3,75 % 16 Numerics.Comma, разделенные: String.split 33387660,000 нс ± 4,02 % 41 PrefixUpTo.Parser 22898,000 нс ± 34,40 % 58197 PrefixUpTo.Scanner.scanUpToString 162816,000 нс ± 18,55 % 8000 Race.Parser 29962.000 нс ± 32,24 % 43186 README Example.Parser: Подстрока 3451.000 нс ± 590,72 % 378685 README Пример. Парсер: UTF8 1247 000 нс ± 110,74 % 1000000 README Example.Adhoc 8134.000 нс ± 34,87 % 161121 Routing.Parser 5242 000 нс ± 52,70 % 249596 String Abstractions.Substring 1044908,500 нс ± 12,95 % 1296 Строковые абстракции.UTF8 138412,000 нс ± 22,64 % 8938 Журналы Xcode. Парсер 6980962 000 нс ± 7,61 % 197
Зайдите в репозиторий Parsing, чтобы опробовать библиотеку сегодня. Для некоторого вдохновения вы могли бы написать парсеры для проверки тестов в проекте.
Подписаться на Point-Free
👋 Привет! Если вы зашли так далеко, то вам, должно быть, понравился этот пост. Вы можете захотеть также ознакомьтесь с Point-Free, серией видеороликов, посвященных продвинутым темам программирования в Быстрый. Подумайте о подписке сегодня!
Будущее мяса без мяса; Это также зеленее и здоровее?
Искусственное мясо, фарш, имитация мяса. Заменители мяса, аналоги и альтернативы. Мясо растительного происхождения. Beyond, Impossible, Tofurky.
Ожидается, что спрос на эти продукты будет продолжать расти [1] , а многочисленные знаменитости одобряют, продвигают и даже инвестируют в их постоянное развитие. Кажется, что наша культура прошла переломный момент. [2] [3] Спрос на заменители мяса растет. Это не значит, что отрасли не нужно решать проблемы: высокие цены, отсутствие разнообразия и более медленное, чем ожидалось, внедрение в ресторанах быстрого питания — все это способствовало охлаждению рынка искусственного мяса. [4] Тем не менее, по сравнению с прошлыми годами, когда в космосе работала лишь горстка нишевых компаний, нельзя отрицать прогресс. В настоящее время существует более 60 брендов, приносящих более 500 000 долларов в розничных продажах, и многие из этих брендов входят в массовое сознание.
Даже гиганты мясной промышленности, такие как Perdue и Tyson, пытались получить прибыль, присоединившись к рынку мясных смесей: категории продуктов, предназначенных для людей, которые хотели бы сократить потребление мяса, но не готовы отказаться от него. это. [5] По словам Дэйва Беттса, соучредителя Misfit Foods, одной из таких компаний, работающих в области мясных смесей: «Мы за меньшее количество мяса, а не за его отсутствие».
Но как насчет тех из нас, кто полностью перешел на растительную пищу? Что можно сказать о самых популярных заменителях мяса? Должны ли мы стремиться к тому, чтобы выйти за пределы Beyond, или эти продукты необходимы для изменения глобального рациона?
Экологические преимущества
Промышленное сельское хозяйство, особенно животноводство, является движущей силой экологической катастрофы. Будь то вклад в утрату биоразнообразия, вырубку лесов, загрязнение, неэффективное землепользование или выбросы парниковых газов, мясо, которое мы производим, и методы производства ставят под угрозу сами элементы, необходимые для поддержания жизни на этой планете (например, чистый воздух). , пресная вода, здоровая почва, опылители).
А из-за увеличения потребления мяса в странах с большим населением, таких как Китай, эти критические экологические угрозы никуда не денутся. [6] Поэтому крайне важно, чтобы мы переключили возросшее потребление и спрос на более устойчивые альтернативы на растительной основе. Тем не менее, многие всеядные не готовы пересмотреть свой рацион, как если бы они полностью перешли на цельнопищевой растительный образ жизни (WFPB): «История показывает, что изменения в пищевом поведении в ответ на вмешательства происходят медленно».
Именно здесь высококачественные заменители мяса могут сыграть столь важную роль.
И да, хотя экологическая польза от употребления в пищу местных растительных продуктов с минимальной обработкой будет еще больше, нет никаких сомнений в том, что заменители мяса являются огромным преимуществом по сравнению с настоящими мясными продуктами.
В ходе оценки жизненного цикла (LCA) Beyond Burger в 2018 году, проведенной Центром устойчивых систем Мичиганского университета, [7] исследователей оценили использование воды, земли, использование невозобновляемых источников энергии и выбросы парниковых газов (GHGE) при производстве Beyond Burger на каждом этапе его разработки, включая обработку, упаковку, хранение в холодильнике, распространение и отходы. Они заключают: «Beyond Burger генерирует на 90 % меньше выбросов парниковых газов, требует на 46 % меньше невозобновляемой энергии, на >99 % меньше влияет на нехватку воды и на 93 % меньше влияет на землепользование, чем ¼ фунта американской говядины».
В отчете, подготовленном Quantis, [8] , Impossible Burger показал аналогичные результаты: «По сравнению с обычным говяжьим фаршем, Impossible Burger® снижает воздействие на окружающую среду во всех категориях воздействия, изученных в этом отчете — на 87% меньше воды, 96 % меньше земли, на 89% меньше выбросов парниковых газов и 9На 2% меньше загрязнителей воды».
Наконец, в более крупном обзоре исследователи изучили 52 исследования LCA, большинство из которых были опубликованы в рецензируемых журналах. [9] Согласно обзору: «У «лучших» источников белка углеродный след примерно в 150 раз меньше, чем у «худших» источников. [И] диапазон землепользования еще больше». Вообще говоря, «наилучшими» источниками являются заменители мяса и растительный белок, а наихудшими источниками являются продукты домашнего скота, причем говядина находится в верхней части спектра. «Пищевые продукты животного происхождения, — заключают они, — оказывают более сильное воздействие, связанное с климатом и землепользованием, чем растительные продукты».
Это не означает, что поддельные мясные продукты являются золотым стандартом для минимизации воздействия на окружающую среду. Как показывает обзор ОЖЦ, существуют значительные различия даже внутри категорий продуктов. Предыдущий LCA подтверждает это, выделяя «горячие точки в цепочке продуктов Beyond Burger, которые могут потребовать внимания [. . . включая] полипропиленовый лоток, используемый в качестве первичной упаковки».
Тем не менее, экологические преимущества перехода всего потребления мяса на такие продукты, как Beyond Burger, будут огромными.
Являются ли заменители мяса полезными с точки зрения питания?
В предыдущей статье мы проанализировали заявления о полезных свойствах органического мяса. В этой статье мы указывали на то, что обоснованность этих утверждений зависит от того, с чем сравнивается органическое мясо. По сравнению с обычным мясом вы можете привести убедительный аргумент. Но, как мы видели в этой статье, здоровее не значит здоровее. Нам было бы лучше выбрать органические продукты, чем органическую говядину.
Тот же уточняющий вопрос относится к искусственному мясу: здоровый по сравнению с чем? По сравнению с цельными растительными продуктами эти продукты с высокой степенью переработки кажутся ужасно вредными для здоровья. Например, в них гораздо больше жира и соли и меньше клетчатки. Несмотря на свою калорийность, они далеко не так богаты витаминами и минералами, как цельные растительные продукты. Их лучше избегать на диете WFPB.
А как насчет мяса? В нескольких исследованиях сравнивался состав питательных веществ заменителей мяса с розничным мясом. [10] [11] [12] Хотя продукты на рынке различаются по питательному составу, можно выделить несколько тенденций. Во-первых, и, пожалуй, наиболее очевидно, заменители мяса содержат больше клетчатки. Они также обычно содержат меньше общего жира и насыщенных жиров (несмотря на то, что обычно содержат кокосовое молоко). Они не содержат диетического холестерина (содержится только в продуктах животного происхождения) или транс-жиров (присутствующих в природе в некоторых мясных и молочных продуктах). Одной из проблем, связанных с мясом на растительной основе, является высокое содержание натрия, распространенная проблема в упакованных продуктах. [13]
Как мы пришли к выводу в статье об изолятах белка: «Употребление в пищу [цельных] растений, а не изолятов, кажется лучшим выбором». Но этих изолятов невозможно избежать при соблюдении диеты с искусственными мясными продуктами. Наиболее распространенными источниками белка в этих продуктах являются соя, горох, пшеница, орехи или их комбинация. Есть ли между ними существенные различия? Нет, согласно статье 2019 года, опубликованной в журнале Sustainability. [14] По мнению авторов, питательный состав этих аналогов мяса из разных источников был одинаковым, равно как и выбросы парниковых газов; «Однако продукты, содержащие яйца, производят значительно большее количество парниковых газов».
Устранение препятствий на пути к изменениям
В Центре исследований в области питания мы всегда выступаем за то, чтобы следовать науке. А когда дело доходит до науки о питании, оптимальный диетический образ жизни избегает продуктов с высокой степенью переработки всех видов, будь то растительного или животного происхождения. Однако есть еще одно направление исследований, не менее научное и обоснованное, — исследование эффективного изменения поведения. Здорово, что мы можем выступать за оптимальное питание. Возможно, вы уже придерживаетесь этой диеты. А как насчет ваших друзей, соседей и коллег? Что стоит между ними и более растительной диетой?
Если бы продукты-трамплин могли помочь людям, которые в противном случае не перешли бы на более растительную диету, это было бы кое-что. . . верно?
В статье 2020 года [15] «недостаточное знакомство и сомнения в эстетике» упоминаются как препятствия на пути к принятию заменителей мяса на растительной основе. Несмотря на растущую популярность и успех этих продуктов на рынке, потребуются дальнейшие исследования, чтобы сделать эти продукты более вкусными. Кроме того, они предполагают, что потребители должны быть осведомлены о различных причинах сокращения потребления мяса: «необходимо повысить осведомленность людей, чтобы попробовать другие, более новые альтернативы мясу».
Другие распространенные препятствия для усыновления включают высокую стоимость и отсутствие доверия. [16] Для анализа нюансов необходимы дополнительные исследования. Например, было бы полезно знать мотивирующие факторы, которые с наибольшей вероятностью приведут к устойчивым изменениям в питании (например, забота об окружающей среде с большей или меньшей вероятностью приведет к успеху, чем пропаганда благополучия животных? не испытываете таких значительных улучшений, как на диете WFPB?). Подобная информация будет полезна не только производителям и продавцам поддельных мясных продуктов, но и политикам. [17]
Это, по крайней мере, ясно: будущее мяса должно быть все более постным. Забудьте о вкусах. Состояние мира требует этого. Что вы думаете о росте популярности брендов заменителей мяса?
Ссылки
- Globe Newswire. Спрос на глобальный рынок растений к 2028 году превысит 15,8 млрд долларов США, а среднегодовой темп роста составит 15%. Факты и факторы. 19 сентября 2022 г. https://www.globenewswire.com/news-release/2022/09/19/2518729/0/en/Demand-for-Global-Plant-Based-Meat-Market-Size-to-Surpass. -USD-15-8-Billions-by-2028-Exhibit-a-CAGR-of-15-Plant-Based-Industry-Trends-Share-Value-Analysis-Forecast-Report-by-Fac.html
- Джонсон, К. Ким Кардашьян, Серена Уильямс и другие знаменитости используют звездную силу для продвижения веганских брендов. Выбрать Овощи. 27 мая 2022 г. https://chooseveg.com/blog/kim-kardashian-beyond-meat/
- Рабб, М. Все эти 20 знаменитостей инвестировали в компании по производству продуктов питания на растительной основе. Свекла. 7 июня 2022 г. https://thebeet.com/celebrities-invested-in-plant-based-food/
- Рейли, Л. Альтернативная мясная лихорадка остыла. Вот почему. Вашингтон Пост. 12 ноября 2022 г. https://www.washingtonpost.com/business/2022/11/12/plant-based-meat-market/
- Laurence, E. «Мясные смеси» призваны примирить нашу любовь к животному белку с потребностью есть больше растительной пищи. Ну+Хорошо. 9 октября 2019 г. https://www.wellandgood.com/meat-blends-products-trends/
- Godfray HCJ, Aveyard P, Garnett T, et al. Потребление мяса, здоровье и окружающая среда. Наука. 2018;361(6399):eaam5324. doi:10.1126/science.aam5324
- Heller MC, Keoleian GA. Оценка жизненного цикла Beyond Meat Beyond Burger: подробное сравнение между растительным и животным источником белка. Центр устойчивых систем Мичиганского университета. 14 сентября 2018 г. https://css.umich.edu/sites/default/files/publication/CSS18-10.pdf
- Хан С., Лойола С., Деттлинг Дж., Хестер Дж., Мозес Р. Сравнительный экологический LCA Impossible Burger с обычным гамбургером из говяжьего фарша. Квантис. 27 февраля 2019 г. https://assets.ctfassets.net/hhv516v5f7sj/4exF7Ex74UoYku640WSF3t/cc213b148ee80fa2d8062e430012ec56/Impossible_foods_comparative_LCA.pdf
- Nijdam D, Rood T, Westhoek H. Цена на белок: обзор землепользования и углеродного следа на основе оценок жизненного цикла пищевых продуктов животного происхождения и их заменителей. Продовольственная политика. 2012;37(6):760-770. https://doi.org/10. 1016/j.foodpol.2012.08.002
- Curtain F, Grafenauer S. Заменители мяса на растительной основе в эпоху флекситарианства: аудит продуктов на полках супермаркетов. Питательные вещества. 2019; 11(11):2603. https://doi.org/10.3390/nu11112603
- Katidi A, Xypolitaki K, Vlassopoulos A, Kapsokefalou M. Пищевая ценность мясных и молочных продуктов растительного происхождения и сравнение с аналогами животного происхождения. Питательные вещества. 2023;15(2):401. Опубликовано 12 января 2023 г. doi: 10.3390 / nu15020401
- Tonheim LE, Austad E, Torheim LE, Henjum S. Растительные заменители мяса и молочных продуктов на норвежском рынке: сравнение содержания макронутриентов в заменителях с эквивалентными мясными и молочными продуктами. Журнал диетологии. 2022;11:e9. doi:10.1017/jns.2022.6
- Национальный центр профилактики хронических заболеваний и укрепления здоровья, Отдел профилактики сердечных заболеваний и инсульта. О натрии. Центры по контролю и профилактике заболеваний (CDC).