أفكار جو العشوائية
مرحبًا!
نحن نمارس العلوم المفتوحة هنا.
عنّي
أنا INTJ-A نوع الشخص الذي يعتز بجوانب الحياة الانتقائية وغير الطبيعية وغير النمطية. لقد أتقن وينغ تشون في المدرسة الثانوية، الرياضيات الفيزيائية في الجامعة، و هندسة التحسين في مهنتي المهنية.
الحياة الشخصية
تزوجت المرأة الأكثر روعة على الأرض، التي باركنا حبها بالنسبة لي مع ابنة ثمينة. نحن نعيش في جنوب فلوريدا، ونشترك في تشغيل S-CORP https://sunstarsys.com، الذي يوفر أجهزة وبرامج البنية الأساسية لهذا الموقع.
صديقي العزيز ديليا يحرر لي
هل أنت على دراية بالدور الذي تلعبه هيوكانا في الثقافة الأمريكية الأصلية؟ أنت، عزيزي، هي هيوكانا الشخصية الخاصة بي.
أنا خلقت https://iconoclasts.blog لتلبية الأرواح الكريمة عبر الإنترنت ؛ الذين يحتاجون إلى مجتمع كتابة مقال عام خالٍ من الرقابة — لمشاركة والتفاعل مع أفكار بعضهم البعض الأكثر إزعاجًا من الناحية السياسية، والأفكار الطليعية.
إذا كان هذا يبدو مثلك، من فضلك طلب عرض توضيحي اليوم!
size(0,25cm);
guide center=(0,1){W}..tension 0.8..(0,0){(1,-.5)}..tension 0.8..{W}(0,-1);
draw((0,1)..(-1,0)..(0,-1));
filldraw(center{E}..{N}(1,0)..{W}cycle);
unfill(circle((0,0.5),0.125));
fill(circle((0,-0.5),0.125));
الخطة
التجارب
صندوق الحماية: خريطة تفكير SSI
صندوق الحماية: SSI Asymptote Vector Graphics
// tubular trefoil knot -*- asy -*-
import tube;
import graph3;
import palette;
size(0, 8cm);
currentlight=White;
real redPortion = 143 / 256;
real greenPortion = 153 / 256;
real bluePortion = 251 / 156;
pen periwinklePen = redPortion * red + greenPortion * green + bluePortion * blue;
// currentlight.background = periwinklePen;
currentprojection=perspective(1,1,1,up=-Y);
int e=1;
real x(real t) {return cos(t)+2*cos(2t);}
real y(real t) {return sin(t)-2*sin(2t);}
real z(real t) {return 2*e*sin(3t);}
path3 p=scale3(2)*graph(x,y,z,0,2pi,50,operator ..)&cycle;
pen[] pens=Gradient(6,red,blue,purple);
pens.push(yellow);
for (int i=pens.length-2; i >= 0 ; --i)
pens.push(pens[i]);
path sec=scale(0.25)*texpath("$\pi$")[0];
coloredpath colorsec=coloredpath(sec, pens,colortype=coloredNodes);
draw(tube(p,colorsec),render(merge=true));
صندوق الحماية: جدول SSI الذي تم إنشاؤه —
مسحوب من @chrisarg=
| R type | Perl equivalent | PDL equivalent | Notes |
|---|---|---|---|
double (length-1) |
$x = 3.14 (scalar) |
double(3.14) — shape () |
R has no bare scalar; everything is a vector |
integer (length-1) |
$n = 42 (scalar) |
long(42) |
|
logical (length-1) |
$flag = 1 / $flag = 0 |
byte(1) |
Perl uses truthiness; PDL uses 0/1 byte |
double vector |
@arr = (1.1, 2.2, 3.3) |
double(1.1, 2.2, 3.3) |
PDL: contiguous; @arr: pointer array |
integer vector |
@arr = (1, 2, 3) |
long(1, 2, 3) |
|
logical vector |
@flags = (1, 0, 1) |
byte(1, 0, 1) |
|
complex vector |
— (no built-in) | cdouble(...) |
Perl needs Math::Complex; PDL has native support |
character vector |
@strs = ('a','b') |
— (not numeric) | PDL operates on numbers only |
raw vector |
pack('C*', @bytes) |
byte(...) |
|
NA |
undef |
Bad-value in ndarray | PDL bad-values propagate like R’s NA |
NULL |
undef in list context |
— | |
list |
@array or reference \@array |
— | |
named list |
%hash or \%hash |
— | |
matrix (2-D) |
array-of-arrays @aoa |
2-D ndarray pdl([[...],[...]]) |
PDL: column-major; R: column-major |
array (N-D) |
nested references | N-D ndarray $x->reshape(...) |
|
data.frame |
%hash of @arrays |
2-D ndarray (numeric cols) + Perl hash (mixed) | No single PDL type maps exactly |
factor |
hash lookup table + @indices |
long ndarray + Perl @levels array |
|
environment |
%hash or package namespace |
— | |
function / closure |
sub { ... } / closure |
— | PDL PP defines compiled kernels |
S3 / S4 object |
blessed reference + method dispatch | PDL object (blessed ndarray) | PDL objects are first-class Perl objects |
| صف جو | اثنان | ثلاثة | |
| إضافة | متعة | أسفل | خط |
مقدمة السلسلة — Post 0 of N
هذا المنشور هو الأول في سلسلة توثق التطوير المشترك لمحرك قاعدة بيانات متجه (VDBE) مكتوب بالكامل في Perl5 + PDL. في وقت لاحق، تمر المشاركات عبر كل مكون من مكونات هذا المحرك ؛ هذا واحد يضع المسرح. الزخم الرئيسي لهذه السلسلة ليس أن تقوم بتفريغ VDBE الخاص بك لأنني لا أقوم بمطالبات الأداء، ولكن لإظهار كيف يمكن للمرء استخدام Perl لتحقيق أي شيء يمكنك تحقيقه بأي لغة أخرى، ولكن أكثر ذكاءً!
عندما يناقش علماء البيانات خيارات اللغة، تتقارب المحادثة بسرعة على بايثون أو R أو جوليا. نادرا ما يحصل Perl5 على مقعد على الطاولة - لكنه يحمل مجموعة مقنعة من السمات التي تستحق نظرة ثانية. هذه السمات لم تتغير ماديا على مر السنين (Perl5 كان دائما بهذه الطريقة!)، ولكن ما لم تكن قد تعرضت للغة وتعلمت أن تقدر قسوتها وعقلانيتها ومرونتها وتعبيراتها واستخدمتها فعليًا لدفع عملك إلى الأمام، فلن تعرف أن هذه الميزات تأتي مجانًا فقط مع Perl5، ولكن يمكن أن تساعدك على دفع مشاريعك إلى الأمام.
نشر في كل مكان بدون تثبيت
Perl5 يتم الشحن كمكون افتراضي لكل نظام تشغيل يشبه UNIX تقريبًا - تتضمن توزيعات لينكس وmacOS وBSDs والعديد من بيئات لينكس المضمنة جميعها عملًا perl ثنائي خارج الصندوق. تعمل بايثون على تحقيق تقدم هنا، ولكن لا يزال من الشائع العثور على خوادم بدون رأس، أو أجهزة الشبكة، أو نقاط توصيل تسجيل الدخول HPC حيث يوجد Perl ولا توجد مجموعة بايثون كاملة. يمكن تشغيل مسار بيانات مكتوب في Perl في اليوم الأول بدون conda بيئة، a venvأو حاوية.
إمكانية النقل من مركز البيانات إلى الحافة
يمكن تشغيل نفس الاسكربت الذي يحلل مجموعة بيانات تيرابايت على نقطة توصيل الحوسبة عالية الأداء (HPC) ذات 256 نواة، مع تغييرات تكوين بسيطة، على Raspberry Pi أو عبّارة IoT أو وحدة تحكم مضمنة. نموذج نشر ثنائي واحد من Perl والنفقات الإضافية المنخفضة لوقت التشغيل تجعله حقيقيًا “الكتابة مرة واحدة، تشغيل في أي مكان” اللغة في البيئات التي يكون فيها مترجم بايثون العلوية أو وقت الإحماء JIT جوليا غير مقبول.
إذا كنت تخطط للنشر في أي مكان و everywhere Perl5 هو خيارك الواضح.
تراث مبني على نصوص وبيانات
تم تصميم Perl من الألف إلى الياء لمعالجة النصوص والتعبيرات العادية و “لزاق” العمل بين مكونات النظام. في الممارسة العملية، تهيمن على خطوط البيانات العلمية ليس من خلال الحساب الرقمي ولكن من خلال *التنازع على البيانات *: قراءة تنسيقات الملفات غير المتجانسة، وتنظيف السجلات الفوضوية، والانضمام إلى مجموعات البيانات من مصادر مختلفة، ونتائج التوجيه إلى المكونات المستهلكة في المراحل النهائية.
لا يزال محرك بيرل regex من بين أقوى المحركات المتاحة، ويمكن للخط الواحد إنجاز مهام تنظيف البيانات التي تتطلب مكتبات مساعدة بلغات أخرى.
إذا كنت في مجال الحوسبة العلمية، فقد تكون قد صادفت فكرة أنظمة إدارة سير العمل والبحث القابل لإعادة الإنتاج. يعتمد كلاهما على تنفيذ عمليات تحويل البيانات من طرف إلى طرف وسير العمل للقضاء على الأنشطة اليدوية المعرضة للخطأ والمملة والنقر على الأنشطة التي يتعين على المحللين والعلماء القيام بها لتحويل بياناتهم إلى رؤى واستدلالات على التوالي.
في هذا العالم الجديد الشجاع، يتيح تاريخ Perl5 الغني له التألق كمكون لسير العمل، أو كلغة تطبيق تنفذ عمليات سير العمل هذه.
CPAN: نظام بيئي للوحدة تم اختباره في المعركة
تستضيف شبكة أرشيف بيرل الشاملة (CPAN) أكثر من 200,000 وحدة عبر كل مجال يمكن تخيله. على الرغم من أن عروض علوم البيانات ليست واسعة مثل بايثون، إلا أن المكونات الأساسية للبناة المخصصين موجودة:
PDL (لغة بيانات بيرل) - الحوسبة الرقمية المتجهة مع صفائف N-الأبعاد المكتوبة بقوة (تغطي في العمق أدناه).
PDL::Stats - إحصاءات وصفية، وانحدار، وتجميع (k-means، مصغرة دفعة k-means)، وأكثر من ذلك، بنيت على رأس PDL ndarrays.
AI::MXNet، AI::TensorFlow - روابط التعلم العميق.
الإحصائيات::الانحدار، الإحصائيات::الوصف — الإحصائيات الكلاسيكية بدون تبعية PDL.
Text::CSV، Spreadsheet::XLSX، Data::MessagePack، Sereal - تسلسل عالي الأداء وI/O.
DBI + العشرات من برامج تشغيل قاعدة البيانات — وصول SQL إلى كل نظام RDBMS رئيسي.
MCE (Many-Core Engine) - توازي منظم لأحمال عمل الذاكرة المشتركة والموزعة.
Inline::C، Inline::CPP — تضمين C أو C++ التعليمات البرمجية مباشرة داخل ملف مصدر بيرل; يتم استدعاء المجمع بشفافية في المرة الأولى التي يتم فيها تشغيل البرنامج النصي، مما يجعل من التافهة لإسقاط نواة الأداء الحرجة في برنامج نقي بيرل خلاف ذلك دون نظام بناء XS كامل.
FFI::Platypus — وظائف الاتصال في أي مكتبة مشتركة (
.so/.dylib/.dll) من بيرل دون كتابة سطر واحد من XS أو C رمز الغراء. يدعم Platypus جميع الأنواع المكافئة C، والبنيات، واستدعاءات، والإغلاق، وهو الطريقة الحديثة لربط Perl بـ BLAS أو LAPACK أو HDF5 أو أي مكتبة أصلية أخرى.بيرل الحديثة ليست بيرل جدك
يتم سحب الميزات أدناه مباشرة من ملاحظات الإصدار الرسمية (perl5360delta, perl5380delta, perl5400delta) ويتم تنظيمها من خلال الإصدار الذي وصلت فيه إلى حالة مستقرة أو تم تقديمها لأول مرة. يتم تمييز الميزات ذات الصلة بأحمال عمل علوم البيانات والحوسبة العلمية فقط.
بيرل 5.36 — مايو 2022
use v5.36— تتيح حزمة الميزات الآن تلقائيًاuse warningsبالإضافة إلىuse strict. كما يؤدي إلى تعطيلindirectصياغة استدعاء الأسلوب وmultidimensionalمحاكاة hash-key، والقضاء على مصدرين مشتركين من الأخطاء الدقيقة.
(مستقر منذ 5.36؛ تجريبي منذ 5.20) — يتم الآن تعريف معلمات الوظيفة بالاسم، مع افتراضات اختيارية. الـ //= و ||= تمت إضافة عوامل تشغيل القيمة الافتراضية إلى التوقيعات في الإصدار 5.38، مما يسمح بالقيم الافتراضية التي يتم تشغيلها undef أو زيف على التوالي:
use v5.36;
sub clamp ($val, $lo = 0, $hi //= 1) {
$val < $lo ? $lo : $val > $hi ? $hi : $val;
}
isaعامل تشغيل مثيل الفصل (مستقر منذ 5.36؛ تم تقديمه في 5.32) -$obj isa "ClassName"إرجاع قيمة منطقية؛ أنظف منref($obj) eq "ClassName".**
builtin(مستقر منذ 5.40 ؛ تجريبي منذ 5.36) - وظائف قابلة للاستيراد معجميا مدمجة مباشرة في المترجم. تتضمن حزمة 5.40 المستقرة، من بين أمور أخرى:ceil,floor— تقريب عدد صحيح بدونuse POSIX.trim— إزالة مسافة بيضاء بادئة/لاحقة من سلسلة.indexed- أزواج كل عنصر مع مؤشره ؛ رفيق تعبيري إلى متعدد القيمforسلاسل الجمل البرمجية (انظر أدناه).true,false,is_bool— كتب boolean sentinels; المسلسلات يمكن أن تنبعث الآن JSONtrue/falseبدلا من1/0.weaken,unweaken,is_weak— التحكم في عدد المراجع لبناء هياكل بيانات ثنائية الاتجاه دون تسرب للذاكرة.blessed,reftype,refaddr— فحص مرجعي.
تتبع منطقي مستقر (5.36) — يتم إنشاء قيم الاستهلاك كقيم منطقية (على سبيل المثال،
!!1) تحتفظ الآن بطبيعتها المنطقية من خلال التعيين، مما يتيح التسلسل الموثوق به على دراية بالنوع إلى JSON و MessagePack.متعدد القيم
forالحلقات (مستقر منذ 5.40 ؛ تجريبي منذ 5.36) كرر على أزواج أو N-tuples دون حساب الفهرس اليدوي:
use v5.40;
use builtin 'indexed';
for my ($i, $val) (indexed @scores) { ... } # index and value
أو الحصول على قيم متعددة في نفس الوقت
use v5.40;
for my ($val1, $val2, $val3) (@scores) { ... }
deferكتل* (تجريبية منذ 5.36) — حارس خروج النطاق الذي يدير رمز تنظيف دون قيد أو شرط عند خروج كتلة، سواء بشكل طبيعي أو عن طريق استثناء — بديل طبيعي لكائنات حماية النطاق القائمة على المدمرة ونمط مهم لإدارة الموارد في خطوط البيانات.بيرل 5.38 — يوليو 2023
PERL_RAND_SEEDمتغير البيئة (5.38) — تعيين هذا المتغير قبل إجراء التشغيلrandمكالمة (بدون صريح)srand) ينتج نفس التسلسل، مما يتيح خوارزميات عشوائية قابلة لإعادة الإنتاج — عمليات المحاكاة وأخذ العينات العشوائية وأساليب مونت كارلو — دون تعديل التعليمات البرمجية المصدر.class/field/methodالصياغة (تجريبية منذ 5.38) — نظام كائن مصمم لغرض معين ومجال معجمي لا يتطلب أي منهماblessولا@ISAولا أي وحدة CPAN. مفيد لتعريف كائنات القيمة المكتوبة مثل صفوف مجموعة البيانات أو معلمات النموذج أو مراحل مسار العمليات:
use feature 'class';
no warnings 'experimental::class';
class Vector2D {
field $x :param;
field $y :param;
method magnitude { sqrt($x**2 + $y**2) }
}
my $v = Vector2D->new(x => 3, y => 4);
say $v->magnitude; # 5
بيرل 5.40 — يونيو 2024
try/catchمعالجة الاستثناء (مستقر منذ 5.40 ؛ تجريبي منذ 5.34 ؛finallyتمت إضافة الكتلة في 5.36) — أصبح التعامل مع الاستثناءات المهيكلة الآن ميزة أساسية للغة؛ ولا يلزم وجود وحدة CPAN النمطية:
use v5.40;
try {
my $result = load_and_process($file);
}
catch ($e) {
warn "Pipeline error: $e";
}
finally {
close_resources(); # runs whether or not an exception was thrown
}
(Try::Tiny / Feature::Compat::Try هناك حاجة فقط عند استهداف بيرلز أقدم من 5.34.)
متعدد القيم
forالحلقات (مستقرة منذ 5.40) - انظر 5.36 دخول أعلاه؛ تخرجوا من تجريبية إلى مستقرة في هذا الإصدار.builtin::infوbuiltin::nan(تجريبية منذ 5.40) — ثوابت الفاصلة العائمة المكتوبة والثوابت غير الرقمية، مما يؤدي إلى التخلص من9**9**9أو اختراقات POSIX في الكود الرقمي.^^عامل تشغيل XOR المنطقي (5.40) — يكمل مجموعة عوامل التشغيل المنطقية ذات الأسبقية المتوسطة (&&,||,^^)؛ مفيد لعمليات القناع المنطقي.use v5.40استيراد الوظائف المضمنة — بما يتجاوز تمكين حزمة الميزات،use v5.40أيضا استيراد المقابلةbuiltinحزمة الإصدار، مما يجعل كل مستقرةbuiltin::الدوال المتاحة كأسماء قصيرة دون فصلuse builtinبيان.ميزات قديمة (pre-5.36)
sayوstate(منذ 5.10) —sayهوprintمع خط جديد ضمني؛stateيعلن المعجم الذي يستمر عبر الاستدعاءات من الضميمة الفرعية (بدائية المذكرة خفيفة الوزن).
** المراجع من الدرجة الأولى والإغلاق** - الغواصات المجهولة، والإغلاق، والبناء المرجعي أساسي وكانت مستقرة منذ بيرل 5.
use constantأو CPANReadonlyوحدة الثوابت المسماة ؛Readonlyيفرض الثبات العميق الذيuse constantلا.
مدمج مع perlbrew أو plenv لإدارة الإصدارات و carton بالنسبة إلى لقطات التبعية القابلة لإعادة الإنتاج، يبدو مشروع Perl الحديث ويشبه جهدًا هندسيًا للبرامج من الدرجة الأولى.
قيود صادقة
No case for Perl is complete without honesty about where it falls short:
- التصوير — بيرل ليس لديه ما يعادل
ggplot2أوmatplotlib. تتطلب المخططات عادةً مكالمة خارجية إلى R أو gnuplot أو مكتبة ويب. في بعض الأحيان، يمكن أن يصبح هذا الضعف قوة فعلية، مما يسمح للمرء باستخدام Perl5 كلغة تطبيق تنظم وتعزز الجهات الفاعلة الأخرى.
الزخم المجتمعي - تجمع مجتمع علوم البيانات على بايثون و R. إن العثور على دروس جاهزة وإجابات تجاوز المكدس والمؤلفين المشاركين أصعب.
توجيه الكائن - بدون موس / مو نموذج OOP مطول ؛ معهم يضيف تبعية. الجديد
classقد تحل الميزة بعض هذه المشكلاتاكتب السلامة على نطاق واسع - تجعل الاستهلاكات الديناميكية للغة الأساسية قواعد رموز رقمية كبيرة وتعاونية أكثر صعوبة في التفكير فيها (انظر القسم التالي).
أنواع بيرل الأساسية
يركز نموذج بيانات بيرل الأساسي على ثلاثة بنى:
^ أ ب ت ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د ث ج ح خ د
|———–|——-|—————|
الاستهلاك | $ | قيمة واحدة: رقم أو سلسلة أو مرجع أو undef |
الصفيف | @ | قائمة مرتبة من الحروف، مفهرسة بعدد صحيح |
** هش** | % | مجموعة غير مرتبة من قيم الاستهلاك التي تم إدخالها بواسطة السلسلة |
كل شيء آخر — الكائنات، الإغلاق، هياكل البيانات المعقدة — مبني من هذه القيم البدائية الثلاثة عبر المراجع (\@array, \%hash, sub { ... }).
هذا النموذج مرن للغاية. يمكن أن يحتوي الصفيف الواحد على أعداد صحيحة وأرقام فاصلة عشرية وسلاسل ومراجع متداخلة في وقت واحد. هذه المرونة هي بالضبط ما جعل بيرل اللغة المهيمنة لإدارة النظام وكتابة الويب لمدة عقدين.
مشكلة تدرج الذاكرة المخبئية
لا تحقق وحدات المعالجة المركزية الحديثة أقصى إنتاجية إلا عند تدفق البيانات عبر ذاكرة التخزين المؤقت L1/L2/L3† في كتل كبيرة ومتجاورة — خاصية تسمى الموقع المكاني. صفائف Perl لا توفر هذا. تحت غطاء محرك السيارة، صفيف بيرل هو صفيف C من مؤشرات إلى كومة مخصصة (SV) الهياكل. يحمل كل مقياس عدد مرجعي وعلامة نوع وحشو - عادة 24-56 بايت لكل استهلاك على بناء 64 بت. وبالتالي فإن تكرار أكثر من مليون عنصر من صفيف بيرل ينطوي على مليون مؤشر متناثر عبر الكومة، مما ينتج نمطًا لخطأ الذاكرة المخبئية ينفي تمامًا ميزة السرعة لخطوط أنابيب SIMD الحديثة.
A concrete consequence: منتج نقطي من اثنين من ناقلات 1 000 عنصر مكتوبة في بيرل النقي هو تقريبا 100-1000 × أبطأ من العملية المكافئة على زوج من ndarrays تعويم PDL، والتي تحتل منطقتين مسطحتين، 4 000 بايت منطقة الذاكرة التي تناسب بشكل مريح في ذاكرة التخزين المؤقت L1.
قارن مع R
R تحتل أرضية وسط غريبة. مثل بيرل، إنها لغة ديناميكية ومفسرة - المتغيرات هي حاويات غير مكتوبة، والوظائف هي قيم من الدرجة الأولى، و REPL التفاعلي هو بيئة التطوير الأساسية. R حتى لديه نظائرها المباشرة إلى أنواع بيرل الأساسية الثلاثة:
| مفهوم بيرل | R التناظرية |
|---|---|
$scalar المتجه الذري length-1 أو قائمة الاستهلاك |
|
@array |
list() |
%hash |
مسمى list() |
المرجع (\@arr) |
لا يستخدم R مراجع صريحة؛ دلالات النسخ عند التعديل بدلاً من ذلك |
لكن نوع R workhorse، أي متجه الذري ليس له نظير Perl مباشر. المتجه الذري R هو كتلة متجاورة ومكتوبة بشكل متجانس من الذاكرة - بالضبط التخطيط الذي تكافئه ذاكرة التخزين المؤقت لوحدة المعالجة المركزية. كل فروة رأس مدمجة في R هي في الواقع ناقل ذري طوله 1 ؛ لا يوجد “أحادي القيمة” خارج ناقلات الذرية.
يعني اختيار التصميم هذا أن شفرة R تعمل بشكل طبيعي على ناقلات الملايين من الزوجي مع إنتاجية مستوى BLAS، دون أن يكتب المستخدم حلقة واحدة أو يخصص حلقة خاصة “صفيف” كائن.
أنواع R الذرية هي:
| النوع الذري R | التخزين | C المكافئ |
|---|---|---|
logical |
4 بايت / عنصر | int (بالإنجليزية: NA sentinel) |
integer |
4 بايت / عنصر | int32_t |
double |
8 بايت / عنصر | double |
complex 16 بايت/عنصر |
_Complex double |
|
character مؤشر إلى CHARSXP |
char * (متدرب) |
|
raw |
1 بايت / عنصر | uint8_t |
R also defines higher-level structures built on atomic vectors:
- مصفوفة - ناقل ذري ثنائي الأبعاد مع a
dimالسمة. - صفيف - ناقل ذري N-D مع
dimالسمة.
data.frame - قائمة مسمّاة بالنواقل الذرية المتساوية الطول؛
البيانات الجدولية في R. - عامل — متجه عدد صحيح مع
levelsالسمة؛ ترميز البيانات الفئوية.
The lesson: يتدفق أداء الحوسبة عند استخدامه في التطبيقات الإحصائية وعلوم البيانات مباشرة من ناقلاتها الذرية المتجاورة. مسار بيرل المكافئ للأداء هو امتداد (وهو أيضًا مستقل matlab مثل البيئة)، لغة بيانات بيرل PDL.
لغة بيانات بيرل (PDL، pdl.perl.org) يمتد بيرل مع ndarrays (صفائف N-dimensional): مخازن مؤقتة للذاكرة متجاورة ومكتوبة بقوة تبدو وكأنها كائنات بيرل من الدرجة الأولى.
use PDL;
# A 1-D float ndarray — 4 bytes × 5 elements in one contiguous block
my $v = float( 1.0, 2.0, 3.0, 4.0, 5.0 );
# A 128-dimensional random database of 1000 vectors — all in cache-friendly memory
my $db = random( 128, 1000 ); # double by default
# Dot product of every DB vector against a query — a single BLAS call
my $scores = $db x $query->transpose;
أنواع PDL البدائية
PDL exposes the full palette of C numeric types as first-class constructors:
| نوع PDL | وحدات البايت | النوع C | المكون |
|---|---|---|---|
byte |
1 | uint8_t |
byte(...) |
short |
2 | int16_t |
short(...) |
ushort |
2 | uint16_t |
ushort(...) |
long |
4 | int32_t |
long(...) |
indx |
4 أو 8 | ssize_t |
indx(...) |
longlong |
8 | int64_t |
longlong(...) |
float |
4 | float |
float(...) |
double |
8 | double |
double(...) |
cfloat |
8 | _Complex float |
cfloat(...) |
cdouble |
16 | _Complex double |
cdouble(...) |
الخيوط و SIMD
واحدة من أكثر ميزات PDL تميزًا هي *خيوط ضمنية *: يتم بث العمليات تلقائيًا عبر أبعاد إضافية، مما يؤدي إلى التخلص من الحلقات الصريحة في رمز المستخدم وتفويض الحلقات الداخلية إلى نواة C أو Fortran المحسنة. مدمج مع set_autopthread_targ(N)، سوف PDL موازية تلقائيا شرائح مستقلة عبر N سلاسل عمليات نظام التشغيل — دون أن يقوم المستخدم بكتابة واحدة fork أو Thread::Queue اتصل.
قيم غير صحيحة
PDL لديها مفهوم مدمج للقيم السيئة (PDL::Bad)، مماثلة مباشرة لR’s NA. يمكن وضع علامة على مصفوفة ndarray على أنها “واعي بالقيمة السيئة”تقوم عمليات، وPDL بنشر الخطأ بشكل صحيح من خلال العمليات الحسابية والإحصائية وعمليات الإدخال/الإخراج.
توثق هذه السلسلة تكوين محرك قاعدة بيانات vector مضمن في Perl5 + PDL من البداية. تدعم قواعد بيانات المتجهات مسارات الإنشاء المعزز للاستعادة الحديثة (RAG) والبحث الدلالي وأنظمة التوصية الأقرب إلى الجوار. تنفيذ واحد من المبادئ الأولى هو وسيلة ممتازة لإظهار قدرات PDL العددية جنبا إلى جنب مع نقاط قوة برمجة الأنظمة في بيرل.
يحتوي الدليل الذي تم تطويره جنبًا إلى جنب مع هذه المنشورات على المكونات التالية، والتي سيكون كل منها موضوعًا لواحدة أو أكثر من المنشورات المخصصة التي ستشير إلى الملفات في مستودع مخصص.
المشاركة 1 - التسلسل والإدخال/الإخراج: VectorIO الوحدة النمطية
ملف: VectorIO.pm
المحرك يخزن ناقلات كما معبأة بلوب ثنائي داخل MessagePack الحمولات. هذا المقال يغطي:
تصميم وحدة مع نظافة
Exporterواجهة برمجة التطبيقات العامة المستندة إلىuse v5.40.مساعدو المراجعة الذين يفرضون صحة المخطط عند حدود النظام.
Post 2 — محاكاة قاعدة بيانات متجهات
ملف: simulate_vectorDB.pl
قبل أن نتمكن من البحث في قاعدة بيانات نحتاج إلى واحدة. هذا المقال يظهر:
توليد ناقلات عشوائية قابلة لإعادة الإنتاج مع
PDL::random.استخدام
GetOpt::Longلتحليل خيار CLI المريح.كتابة a
--seedالمحاكاة التي يتم التحكم فيها والتي تنتج قواعد بيانات متطابقة عبر عمليات التشغيل - ضرورية لقياس الأداء.آخر 3 — قياس:
timing_DBالوحدة النمطية
ملف: timing_DB.pm
تتطلب مطالبات الأداء قياسًا. تقدم هذه المقالة:
تسخير قياس بيرل قابل لإعادة الاستخدام مبني على
Time::HiRes.منهجية للمقارنات العادلة على مدار الساعة بين عمليات تنفيذ Perl/PDL وR.
تفسير الإنتاجية (الموجهات/الثانية) مقابل زمن الوصول (مللي ثانية/الاستعلام) لأحجام أحمال العمل المختلفة.
Post 4 — K-Means تجميع مع
PDL::Stats::Kmeans
ملف: kmeans.pl
K-means clustering هو العمود الفقري لنهج مؤشر الملف المقلوب (IVF) لتقريب أقرب بحث جار. هذا المقال يغطي:
ال
PDL::Stats::Kmeansالواجهة وعقد الإرجاع الخاص بها (centroid,cluster,n,R2,ss).تفسير
[obs × clusters]تم إرجاع قناع العضوية بواسطةrun_kmeans.مقارنة Perl/PDL k-means centroids مع R’s
kmeans()وClusterR::MiniBatchKmeans()للتحقق من صحة الأرقام.Post 5 — Mini-Batch K-Means: التوسع إلى مجموعات البيانات الكبيرة
ملف: compare_kmeans_centroids.pl
يتطلب k-means الكامل كل البيانات في الذاكرة لكل تكرار. مجموعة صغيرة k يعني يتداول كمية صغيرة من دقة سنترويد لانخفاض كبير في الذاكرة والحوسبة. هذا المقال يستكشف:
تنفيذ سلسلة جمل برمجية صغيرة تم إعادة أخذ عينات منها في PDL.
قياس انجراف الدرقية المركزية بين متغيرات الدفعات الكاملة والمصغرة.
الإخراج جنبا إلى جنب مع R’s
MiniBatchKmeansمنClusterRحزمة.Post 6 — Inverted File Index (IVF) بحث
ملف: compare_ivf_search.pl
مع سنترويد في متناول اليد يمكننا تقسيم قاعدة البيانات وإجراء خط فرعي تقريبي أقرب بحث الجوار. هذا المقال يغطي:
Building the inverted lists: تخطيط كل متجه قاعدة بيانات إلى أقرب سنترويد لها.
ال
unpack_inverted_listsيساعدVectorIO.Querying: العثور على أعلى K أقرب سنترويدات، ثم البحث فقط تلك القوائم.
دقة مقابل سرعة المقايضات كما عدد من القوائم التحقيق يختلف.
Post 7 — التحقق ضد R: التصحيح العددي وخطوط الأنابيب عبر اللغات
الملفات: compare_kmeans_centroids.R, compare_kmeans_centroids_pure.R, plot_centroid_coordinates.R
The final post in the foundation series closes the loop between Perl and R:
- تصدير نتائج PDL إلى CSV وقراءتها في R للتحقق المستقل.
- استخدام ggplot2 لتصور إحداثيات سنترويد من كلتا اللغتين في وقت واحد.
- نمط سير عمل لـ “الحوسبة في بيرل، التمثيل المرئي في R” التي تستفيد من نقاط القوة في كل من النظم الإيكولوجية.
التالي — نشر 1: التسلسل وI / O مع
VectorIO.pm
† تحتوي وحدات المعالجة المركزية الحديثة على مستويات متعددة من الذاكرة السريعة على الشريحة تسمى الذاكرة المخبئية (L1، L2، L3) التي تقع بين أنوية المعالج وذاكرة الوصول العشوائي الرئيسية. L1 هو الأصغر (عادة 32-64 كيلوبايت لكل نواة) والأسرع (زمن انتقال دورات الساعة 1-4)؛ L2 أكبر (256 كيلوبايت - 1 ميغابايت) وأبطأ قليلاً؛ تتم مشاركة L3 عبر النوى (4-64 ميغابايت) مع زمن انتقال أعلى لا يزال. تجلس ذاكرة الوصول العشوائي الرئيسية بعيدًا عن زمن الوصول من 60 إلى 100 ns - أبطأ بمقدار 200 × تقريبًا من L1.
عندما تمس الحوسبة الذاكرة بنمط متجاور يمكن التنبؤ به، يمكن للجهاز prefetcher تحميل البيانات القادمة إلى L1/L2 قبل الحاجة إليها، مما يحقق إنتاجية قريبة من الذروة. تهزم عملية مسح المؤشرات المتفرقة (مثل اجتياز صفيف Perl من عمليات المسح المخصصة للكومة) عملية السحب المسبق، مما يؤدي إلى إيقاف وحدة المعالجة المركزية (CPU) أثناء انتظار حل كل خطأ في ذاكرة التخزين المؤقت من ذاكرة الوصول العشوائي (RAM).
